`
SwordShadow
  • 浏览: 268230 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

itext的PDF生成方案

    博客分类:
  • java
阅读更多

itext实现HTML转pdf网上有很多实现方案,可惜大部分没有提供完整的源码下载,而有的方案却随着itext API的升级而失效,在此记录一下解决此问题的过程。

 

方法一:

最初是在老外的网站看到 http://hmkcode.com/itext-html-to-pdf-using-java/ 

// step 1
            Document document = new Document();
        // step 2
            PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("pdf.pdf"));
        // step 3
        document.open();
        // step 4
        XMLWorkerHelper.getInstance().parseXHtml(writer, document,
                new FileInputStream("index.html"));        
        //step 5
         document.close();

        System.out.println( "PDF Created!" );

Maven构建对应的版本  关于eclipse配置maven,可以参考此文

<dependency>
          <groupId>com.itextpdf</groupId>
                <artifactId>itextpdf</artifactId>
                <version>5.4.2</version>
        </dependency>
        <dependency>
                <groupId>com.itextpdf.tool</groupId>
                <artifactId>xmlworker</artifactId>
                <version>5.4.1</version>
        </dependency>

 

 

 最简单的方式,HTML支持度很好,可惜不支持中文 源码地址:https://github.com/hmkcode/Java/blob/master/itext-java-html-pdf

 

 方法二:

使用的jar包:itext-2.0.8.jar  core-render.jar

 

App.java

/**
 * 
 * @author LJS
 * 
 */
public class App {
	public void createPdf() throws Exception {
		// step 1
		String inputFile = "index.html";
		String url = new File(inputFile).toURI().toURL().toString();
		String outputFile = "index.pdf";
		System.out.println(url);
		// step 2
		OutputStream os = new FileOutputStream(outputFile);
		org.xhtmlrenderer.pdf.ITextRenderer renderer = new ITextRenderer();
		renderer.setDocument(url);

		// step 3 解决中文支持
		org.xhtmlrenderer.pdf.ITextFontResolver fontResolver = renderer
				.getFontResolver();
		fontResolver.addFont("c:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H,   
				BaseFont.NOT_EMBEDDED);

		renderer.layout();
		renderer.createPDF(os);
		os.close();
		
		System.out.println("create pdf done!!");
	}
        

	public static void main(String[] args) throws Exception {
		App app = new App();
		app.createPdf();
	}

}

注意指定中文字体

要转换的HTML

index.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">     
<html xmlns="http://www.w3.org/1999/xhtml ">     
<head>     
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />     
<title>itext-zh-cn</title>     
<style type="text/css">         
body {     
			font-family: SimSun;
}     
</style></head>     
     
<body>
<p align="left" >OK,支持中文了:)</p>

</body>     
</html> 

 同样也要指定中文字体,区分大小写

 运行程序,转换结果:



(字体样式和大家熟知的宋体不同,因为我替换了系统默认的宋体,pdf查看工具推荐PDF-XChange Viewer) 

 

 

pdf样式修改为A4 ( Document doc = new Document(PageSize.A4.rotate());)

在index.html中添加

<style type="text/css"> 
@page{ size: 11.69in 8.27in;}
...
</style>

 

 

注意:无论哪种方式的Html格式转换pdf,对于html源文件要求是语法严格的;方法二支持基本的CSS样式,可以调整出合适的HTML模板。

 

大家有更好的方法,欢迎交流{#emotions_dlg.laughing}

 

其他:itext添加图片方法:实际应用中,应该与生成pdf合成一步提升性能

public static void addImg(String fm) throws Exception {
	PdfReader reader = new PdfReader("temp.pdf");
	PdfStamper stamp = new PdfStamper(reader,new FileOutputStream("model.pdf"));
	Image img = Image.getInstance("code.png");  //使用png格式
	img.setAlignment(Image.LEFT | Image.TEXTWRAP);
	img.setBorderWidth(10);
	img.setAbsolutePosition(420, 240);
	img.scaleToFit(1000, 60);// 大小
	PdfContentByte over = stamp.getUnderContent(1); // overCount 与underCount 
	over.addImage(img);
	stamp.close();
	reader.close();
	}

  itext 版本号众多,可以在gerpcode查找其所有的版本

 

 补充:其他关于pdf生成的有帮助的文章参考:

介绍一个PDF的生成方案

使用PDF模板输出报表的实践

Itext 实现html转换成pdf

Generating PDFs for Fun and Profit with Flying Saucer and iText

itext 常用API参考

http://iaiai.iteye.com/blog/1549769

http://rensanning.iteye.com/blog/1538689

 

 

 

 

  • 大小: 17.1 KB
分享到:
评论
10 楼 willremember 2016-03-04  
问题出在模板上font-family和代码里不一致,解决啦。
9 楼 weinian_fighting 2015-07-09  
      
非常感谢楼主无私分享~~
8 楼 高军威 2014-08-05  
animo_itey 写道
SwordShadow 写道
各位出现问题的朋友,希望你们能够解决问题,不懂的可以去论坛提问,附件中有完整的代码,字体文件,导入myeclipse 可以直接使用的


楼主 我遇到一个问题 就是html比如一行文字很长 在html中可以换行
但是生成pdf后无法换行阿  。。。急求阿  8号上线 !

看看 这个吧 我们 项目也用到了,效果很不错,自己改写可以添加 页眉页脚 和第几页,自己 好好研究哦http://gaojunwei.iteye.com/blog/1996749
7 楼 animo_itey 2014-08-05  
SwordShadow 写道
各位出现问题的朋友,希望你们能够解决问题,不懂的可以去论坛提问,附件中有完整的代码,字体文件,导入myeclipse 可以直接使用的


楼主 我遇到一个问题 就是html比如一行文字很长 在html中可以换行
但是生成pdf后无法换行阿  。。。急求阿  8号上线 !
6 楼 SwordShadow 2014-08-04  
各位出现问题的朋友,希望你们能够解决问题,不懂的可以去论坛提问,附件中有完整的代码,字体文件,导入myeclipse 可以直接使用的
5 楼 animo_itey 2014-08-01  
博主 博主 博主 你在吗 ?
我遇到问题了 QQ 289224491 ! 能加一下么,我想相你咨询下.
4 楼 mbq820 2014-05-15  
楼主 为什么我的提示不支持该字体呢?
3 楼 高军威 2014-01-16  
SwordShadow 写道
高军威 写道
要是直接部署到外网,不知道直接引用字体这种能不能用,楼主有何见解啊


可以将字体文件放在外网服务器的某个文件夹内

我把字体的安装包放到项目中去,直接引用,不能用,好像是引用他安装后 的文件
2 楼 SwordShadow 2014-01-16  
高军威 写道
要是直接部署到外网,不知道直接引用字体这种能不能用,楼主有何见解啊


可以将字体文件放在外网服务器的某个文件夹内
1 楼 高军威 2014-01-16  
要是直接部署到外网,不知道直接引用字体这种能不能用,楼主有何见解啊

相关推荐

    html转pdfHTML导出PDF中文、ITEXT转HTML为PDF包括中文显示解决方案

    1、解决中文问题 2、附字体 3、动态html拼接转pdf ... OutputStream os = new FileOutputStream(outputFile); ITextRenderer renderer = new ITextRenderer();... System.out.println("生成结束!!!"); }

    Java实现HTML页面转PDF解决方案

    首先,当然是找到能够解析PDF的完美组件,百度和谷歌不约而同的告诉我们。IText是王道。...那我要做的是能完美解析HTML+CSS的PDF生成工具。这时候flying-saucer进入了我的选择范围中。  http://cod

    java8源码-java-vue-pdf:java通过vuessr动态生成pdf解决方案Itonlyneedsvue

    java接收到html通过itext生成pdf 注:由于ssr只支持get请求,所以如果一次将所有数据都通过url传送的方式不太好,因此通过传递id反向查询数据的方式更靠谱 准备 java8(本人使用) node10(本人使用) 安装字体。生成pdf...

    excel2pdf:An easy way to convert Excel to PDF by Java code based on Apache POI and itextpdf. 利用 JAVA 编写把 Excel 转 PDF 解决方案,依赖POI与IText库的实现

    根据任意excel模版,将任意值填入到模版里面,然后生成pdf。(纯java实现) 支持多sheet页 举个例子: excel模版如下: 然后假如这里要将纳税人识号和税款所属期这个两个单元格的值写入我们想要的值 public class ...

    Java报表生成解决方案

    该代码提供了word、excel、pdf三种类型的文档生成方案,其中word文档使用“freemarker + xml + 模板”技术;excel使用“POI + 模板”技术;pdf使用“freemarker + itext + flying saucer”技术

    java pdf方案测试

    java html生成pdf的解决方案,包括常见错误的处理,如中文问题、css路径、图片,内有测试例子等。是java中pdf方案的好帮手哦

    纯js实现html转pdf的简单实例(推荐)

    项目开发中遇到了一个变态需求,需要把一整个页面导出为pdf格式,而且要保留页面上的所有的表格、svg图片和样式。 简而言之,就是希望像截图一样,把整个页面截下来,然后保存成...3、还有一种是利用iText类后台生成j

    word转pdf所需的jar

    操作PDF通常使用的是ITEXT插件,该插件可以操作复杂的PDF,当然我们也可以通过freemarker来生成PDF也是可以的。但是最近的项目在打印合同的时候,只提供了word模板,然后打印PDF,期间需要读取数据,填充到Word文档中...

    java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密

    历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案

    exportDoc:使用Itext API解决使用Java创建Word文档的问题

    exportDoc该demo是使用Itext实现Java生成word文档,当然,还有其他方式可以,例如:jacob,但是它局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案;另一种是pio但是它是excel处理程序 对于...

    pdf-iframe.zip

    手头的项目有这样一个需求,审核报告开发,左侧是PDF,右侧是审核的辅助信息。...b 利用itext生成所需要的报告并把绝对路径赋值到pdfTumor.jsp; c 调用controller里的pdf方法把数据传输到页面展示。

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    PDF格式扫描版,全书分为24章,共817页。2011年1月出版。 全书压缩打包成4部分,这是第3部分 注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可...

    JAVA上百实例源码以及开源项目

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    JAVA上百实例源码以及开源项目源代码

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

Global site tag (gtag.js) - Google Analytics