java-pdf-(itext+adobe acrobat+pdf模板)生成pdf文件
2017-04-28 13:46
871 查看
java-pdf-(itext+adobe acrobat+pdf模板)生成pdf文件
环境:
adobe acrobat :pdf 编辑器;
itext.jar : pdf 开发组件
1.制作 pdf 模板方法
1.1 使用 word 随便画一个 3*4 的表格,保存为 pdf 格式,名称为 pdf-template-form.pdf
1.2 打开 adobe acrobat 工具;(如果提示错误,右键选择以管理员方式运行试试)
1.3 选择 文件=》创建=》创建表单;
1.4 选择刚保存的“pdf-template-form.pdf”文件,并打开;
1.5 adobe acrobat 工具会在表格中自动填充一些“文本域”,默认已 “fill_” 开头;
1.6 看到有 12 个 文本域,就说明模板创建成功了,直接 ctrl+s 保存下,关闭即可;
2.用 itext 填充文本域
2.1 中文不显示问题:1>可以在编辑模板时选择一种中文字体;2>可以通过程序动态在填充前动态设置字体;
2.2 加入中文字体后文档变的很大,模板 200k,生成的文件有 6M,有待解决;
添加 maven 依赖:
测试代码:右键 run as -> junit test,运行 fillTemplate 方法
环境:
adobe acrobat :pdf 编辑器;
itext.jar : pdf 开发组件
1.制作 pdf 模板方法
1.1 使用 word 随便画一个 3*4 的表格,保存为 pdf 格式,名称为 pdf-template-form.pdf
1.2 打开 adobe acrobat 工具;(如果提示错误,右键选择以管理员方式运行试试)
1.3 选择 文件=》创建=》创建表单;
1.4 选择刚保存的“pdf-template-form.pdf”文件,并打开;
1.5 adobe acrobat 工具会在表格中自动填充一些“文本域”,默认已 “fill_” 开头;
1.6 看到有 12 个 文本域,就说明模板创建成功了,直接 ctrl+s 保存下,关闭即可;
2.用 itext 填充文本域
2.1 中文不显示问题:1>可以在编辑模板时选择一种中文字体;2>可以通过程序动态在填充前动态设置字体;
2.2 加入中文字体后文档变的很大,模板 200k,生成的文件有 6M,有待解决;
添加 maven 依赖:
<!-- pdf 生成 ,通过 pdf 模板--> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency>
测试代码:右键 run as -> junit test,运行 fillTemplate 方法
package com.demo.preview; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.junit.Test; import com.lowagie.text.Document; import com.lowagie.text.DocumentException; import com.lowagie.text.Font; import com.lowagie.text.Paragraph; import com.lowagie.text.pdf.AcroFields; import com.lowagie.text.pdf.BaseFont; import com.lowagie.text.pdf.PdfCopy; import com.lowagie.text.pdf.PdfImportedPage; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfStamper; import com.lowagie.text.pdf.PdfWriter; import me.grass.extend.DateExtend; import me.grass.extend.PathExtend; import me.grass.extend.StringExtend; /** * * @author xxj */ public class ITextPdfTest { // 利用模板生成pdf @Test public void fillTemplate() { // 模板路径 String templatePath = "D:/Temp/pdf/pdf-template-form.pdf"; // 生成的新文件路径 String fileName = StringExtend.format("itext-template-{0}.pdf", DateExtend.getDate("yyyyMMddHHmmss")); String newPDFPath = PathExtend.Combine("D:/Temp/pdf/", fileName); PdfReader reader; FileOutputStream out; ByteArrayOutputStream bos; PdfStamper stamper; try { out = new FileOutputStream(newPDFPath);// 输出流 reader = new PdfReader(templatePath);// 读取pdf模板 bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); //字体,使用本机的宋体 String font_cn = getChineseFont(); BaseFont bf = BaseFont.createFont(font_cn+",1", //注意这里有一个,1 BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); String[] str = { "01.hello word!", "02.你好,世界!", "03.hello word!", "04.你好,世界!", "05.hello word!", "06.你好,世界!", "07.hello word!", "08.你好,世界!", "09.hello word!", "10.你好,世界!", "11.hello word!", "12.你好,世界!", }; int i = 0; java.util.Iterator<String> it = form.getFields().keySet().iterator(); while (it.hasNext()) { //获取文本域名称 String name = it.next().toString(); //设置文本域字体 form.setFieldProperty(name,"textfont",bf,null); System.out.println(name); //设置文本域内容 form.setField(name, str[i++]); } stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true stamper.close(); Document doc = new Document(); PdfCopy copy = new PdfCopy(doc, out); doc.open(); PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1); copy.addPage(importPage); doc.close(); } catch (IOException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } } /** * 获取中文字体位置 * @return * @author xxj 2017年4月28日 */ private String getChineseFont(){ //宋体(对应css中的 属性 font-family: SimSun; /*宋体*/) String font1 ="C:/Windows/Fonts/simsun.ttc"; //判断系统类型,加载字体文件 java.util.Properties prop = System.getProperties(); String osName = prop.getProperty("os.name").toLowerCase(); System.out.println(osName); if (osName.indexOf("linux")>-1) { font1="/usr/share/fonts/simsun.ttc"; } if(!new File(font1).exists()){ throw new RuntimeException("字体文件不存在,影响导出pdf中文显示!"+font1); } return font1; } }
相关文章推荐
- java 使用itextpdf.jar和itext-asian.jar根据pdf模板填写数据后生成一个新的pdf文件
- Itext生成PDF文件加密与加水印 ( 2008-07-17 11:35:33| 分类: java 技术)
- Java应用iText动态生成PDF文件-温柔一刀
- 【java】 iText使用PDF模板生成输出PDF
- java通过xml配置属性用iText包生成pdf文件
- 使用freemaker和itext从html模板生成pdf文件
- java生成PDF文件(itext)
- 【Java】使用iText生成PDF文件
- Java iText使用PDF模板生成PDF文档
- 关于Java Web 使用 iText 将数据库中的 表 的数据 生成 PDF 格式文件(升級版本)
- itext使用模板生成pdf文件
- Java iText PDF:用 iText 包生成简单的 pdf 文件
- 如何利用iText在java程序中生成PDF文件
- 如何利用iText在java程序中生成PDF文件
- java使用IText生成PDF格式文件
- 从 Java 应用程序动态生成 PDF 文件一个简化了 PDF 创建过程的开源库 iText 的分步指南
- 如何利用iText在java程序中生成PDF文件
- 滴水穿石--Java 生成PDF文件--iText使用之插入图片和中文乱码
- itext使用模板生成pdf文件
- Java IText使用PDF模板 生成 输出PDF