java-pdf-(itext+adobe acrobat+pdf模板)生成pdf文件

浅浅的花香味﹌ 2024-02-17 21:35 208阅读 0赞

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 依赖:

  1. <!-- pdf 生成 ,通过 pdf 模板-->
  2. <dependency>
  3. <groupId>com.lowagie</groupId>
  4. <artifactId>itext</artifactId>
  5. <version>2.1.7</version>
  6. </dependency>

测试代码:右键 run as -> junit test,运行 fillTemplate 方法

  1. package com.demo.preview;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import org.junit.Test;
  7. import com.lowagie.text.Document;
  8. import com.lowagie.text.DocumentException;
  9. import com.lowagie.text.Font;
  10. import com.lowagie.text.Paragraph;
  11. import com.lowagie.text.pdf.AcroFields;
  12. import com.lowagie.text.pdf.BaseFont;
  13. import com.lowagie.text.pdf.PdfCopy;
  14. import com.lowagie.text.pdf.PdfImportedPage;
  15. import com.lowagie.text.pdf.PdfReader;
  16. import com.lowagie.text.pdf.PdfStamper;
  17. import com.lowagie.text.pdf.PdfWriter;
  18. import me.grass.extend.DateExtend;
  19. import me.grass.extend.PathExtend;
  20. import me.grass.extend.StringExtend;
  21. /**
  22. *
  23. * @author xxj
  24. */
  25. public class ITextPdfTest {
  26. // 利用模板生成pdf
  27. @Test
  28. public void fillTemplate() {
  29. // 模板路径
  30. String templatePath = "D:/Temp/pdf/pdf-template-form.pdf";
  31. // 生成的新文件路径
  32. String fileName = StringExtend.format("itext-template-{0}.pdf", DateExtend.getDate("yyyyMMddHHmmss"));
  33. String newPDFPath = PathExtend.Combine("D:/Temp/pdf/", fileName);
  34. PdfReader reader;
  35. FileOutputStream out;
  36. ByteArrayOutputStream bos;
  37. PdfStamper stamper;
  38. try {
  39. out = new FileOutputStream(newPDFPath);// 输出流
  40. reader = new PdfReader(templatePath);// 读取pdf模板
  41. bos = new ByteArrayOutputStream();
  42. stamper = new PdfStamper(reader, bos);
  43. AcroFields form = stamper.getAcroFields();
  44. //字体,使用本机的宋体
  45. String font_cn = getChineseFont();
  46. BaseFont bf = BaseFont.createFont(font_cn+",1", //注意这里有一个,1
  47. BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
  48. String[] str = {
  49. "01.hello word!",
  50. "02.你好,世界!",
  51. "03.hello word!",
  52. "04.你好,世界!",
  53. "05.hello word!",
  54. "06.你好,世界!",
  55. "07.hello word!",
  56. "08.你好,世界!",
  57. "09.hello word!",
  58. "10.你好,世界!",
  59. "11.hello word!",
  60. "12.你好,世界!", };
  61. int i = 0;
  62. java.util.Iterator<String> it = form.getFields().keySet().iterator();
  63. while (it.hasNext()) {
  64. //获取文本域名称
  65. String name = it.next().toString();
  66. //设置文本域字体
  67. form.setFieldProperty(name,"textfont",bf,null);
  68. System.out.println(name);
  69. //设置文本域内容
  70. form.setField(name, str[i++]);
  71. }
  72. stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
  73. stamper.close();
  74. Document doc = new Document();
  75. PdfCopy copy = new PdfCopy(doc, out);
  76. doc.open();
  77. PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
  78. copy.addPage(importPage);
  79. doc.close();
  80. } catch (IOException e) {
  81. e.printStackTrace();
  82. } catch (DocumentException e) {
  83. e.printStackTrace();
  84. } catch (Exception e){
  85. e.printStackTrace();
  86. }
  87. }
  88. /**
  89. * 获取中文字体位置
  90. * @return
  91. * @author xxj 2017年4月28日
  92. */
  93. private String getChineseFont(){
  94. //宋体(对应css中的 属性 font-family: SimSun; /*宋体*/)
  95. String font1 ="C:/Windows/Fonts/simsun.ttc";
  96. //判断系统类型,加载字体文件
  97. java.util.Properties prop = System.getProperties();
  98. String osName = prop.getProperty("os.name").toLowerCase();
  99. System.out.println(osName);
  100. if (osName.indexOf("linux")>-1) {
  101. font1="/usr/share/fonts/simsun.ttc";
  102. }
  103. if(!new File(font1).exists()){
  104. throw new RuntimeException("字体文件不存在,影响导出pdf中文显示!"+font1);
  105. }
  106. return font1;
  107. }
  108. }

发表评论

表情:
评论列表 (有 0 条评论,208人围观)

还没有评论,来说两句吧...

相关阅读