当前位置:   article > 正文

OFD开发系列(二)-模板填充_ofd文件模板

ofd文件模板

原文链接:https://blog.csdn.net/oAXuHui/article/details/109726036

#、接上篇
我们前面对水印填充方法进行了简单介绍,本章描述的模板填充,可以是正文的填充,也可以是水印填充,水印填充可参考上一篇《OFD开发系列(一)-添加水印》。

一、什么是模板填充
模板填充是指基于固定的模板文档,在指定的位置(坐标/百分比)或文本替换填入所需的图片、文本、日期等内容,最后生成一个可用的文档以供用户存档、检索、签署等。我们知道,PDF可以使用表单填充,并且可以设置文字的字体、颜色、字号、对齐方式等。而在OFD版式文档里,没有表单的概念,我们需要采用其它方法进行填充。如下所示:

基于关键字填充:此处需要查找关键字,然后增加相对应的偏移值进行填充。
基于坐标填充:此处可以指定坐标x/y值(单位mm)或百分比进行填充,这种填充方法需要模板编辑系统的支持,例如:在页面上标注好填充坐标或填充百分比位置。
基于文本替换:此处可以基于模板引擎进行文本替换或自定义标识符,该方法可能会对版式文档的阅读版式产生影响,需要定义好字符长度、字体、字号等参数。

二、模板填充的场景
常见的填充场景有如下几类:电子保单、电子合同、取证报告、调查问卷、电子发票等。总之,关键内容需要变更的电子文档,都需要具备模板填充能力。

三、ofdrw实现填充
3.1、模板填充准备

我们将上文提到的模板填充方法(关键字填充、坐标填充)进行模板填充演示,文本替换各位可以基于模板引擎直接实现文本替换,此处不进行详细说明。

首先,我们需要在maven引入ofdrw的jar包(注意此处由于ofdrw功能优化升级和上一篇的版本不一致):

  1. <!--junit-->
  2. <dependency>
  3. <groupId>junit</groupId>
  4. <artifactId>junit</artifactId>
  5. <version>4.12</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>commons-io</groupId>
  10. <artifactId>commons-io</artifactId>
  11. <version>2.6</version>
  12. <scope>provided</scope>
  13. </dependency>
  14. <!-- ofdrw -->
  15. <dependency>
  16. <groupId>org.ofdrw</groupId>
  17. <artifactId>ofdrw-full</artifactId>
  18. <version>1.6.10</version>
  19. </dependency>

其次,我们准备一个待填充的模板文档,第一列为A列,第二列为B列,其中事项标题为A1,A1旁边为B1,以此类推,如下所示:

3.2、关键字填充

我们需要对事项标题后面的文本框填入“基于ofdrw的关键字模板填充实现”,申请依据后面填入“新版本演示”。代码如下:

  1. /**
  2. * 模板处理
  3. */
  4. @Test
  5. public void testTemplateTextBaseKeyword() throws IOException, DocumentException {
  6. Path inP = Paths.get("src/test/resources/z.ofd");
  7. Path outP = Paths.get("target/Canvas-fillText.ofd");
  8. try (OFDReader reader = new OFDReader(inP);
  9. OFDDoc ofdDoc = new OFDDoc(reader, outP)) {
  10. String t1 = "事项标题", t2 = "申请依据";
  11. String f1 = "基于ofdrw的关键字模板填充实现", f2 = "新版本演示";
  12. String[] keywords = {t1, t2};
  13. List<KeywordPosition> positionList = KeywordExtractor.getKeyWordPositionList(reader, keywords);
  14. //偏移量需要模板制作确认
  15. float offset = 25;
  16. for (KeywordPosition position : positionList) {
  17. //创建可追加的虚拟页面
  18. AdditionVPage page = ofdDoc.getAVPage(position.getPage());
  19. //创建一个可以自动换行的段落
  20. Paragraph paragraph = new Paragraph();
  21. paragraph.setPosition(Position.Absolute)
  22. .setWidth(f1.length() * 5.0).setHeight(10D) //设置外接矩形宽高
  23. .setX(position.getBox().getTopLeftX() + position.getBox().getWidth() + offset) //设置x坐标
  24. .setY(position.getBox().getTopLeftY()); //设置y坐标
  25. //创建 Span 文本控件对象
  26. Span span;
  27. if (t1.equals(position.getKeyword())) {
  28. span = new Span(f1);
  29. } else {
  30. span = new Span(f2);
  31. }
  32. //设置Span的属性
  33. span.setFontSize(5.0);
  34. span.setColor(0, 0, 0);
  35. //段落添加Span文本控件
  36. paragraph.add(span);
  37. //页面添加段落
  38. page.add(paragraph);
  39. }
  40. }
  41. System.out.println("生成文档位置:" + outP.toAbsolutePath().toString());
  42. }

此处通过KeywordExtractor检索到两个关键字的坐标,制作确认模板偏移量,通过循环创建,完成模板填充。特别指出:需要创建可追加的虚拟页面和需要计算好外接矩形的x/y坐标和宽高,文本控件对象Span支持的设置很多,如下所示,在此不在详述:

  1. public class Span implements TextFontInfo {
  2. private Font font;
  3. private Double fontSize;
  4. private Double letterSpacing;
  5. private boolean bold;
  6. private boolean italic;
  7. private boolean underline;
  8. private String text;
  9. private int[] fillColor;
  10. private boolean linebreak;
  11. private Boolean integrity;
  12. }

填充效果如下:

3.3、坐标填充

我们需要对事项依据下面的单元格A3 和 A3右边的单元格B3进行坐标填充,同样的,我们需要制作填充模板,确提前确定坐标位置,A3使用毫米单位,B3使用百分比单位。代码如下所示:

  1. /**
  2. * 模板处理
  3. */
  4. @Test
  5. public void testTemplateTextBaseKeyword() throws IOException, DocumentException {
  6. Path inP = Paths.get("src/test/resources/z.ofd");
  7. Path outP = Paths.get("target/Canvas-fillText.ofd");
  8. try (OFDReader reader = new OFDReader(inP);
  9. OFDDoc ofdDoc = new OFDDoc(reader, outP)) {
  10. String key = "申请人", value = "ofdrw";
  11. /*
  12. * 此处参数值需要模板确定
  13. */
  14. double A3_X = 30, A3_Y = 60.77;
  15. //此处为36%和20.33%
  16. double B3_X = 0.36 * ofdDoc.getPageLayout().getWidth(),
  17. B3_Y = 0.2033 * ofdDoc.getPageLayout().getHeight();
  18. //创建可追加的虚拟页面(指定第1页)
  19. AdditionVPage page = ofdDoc.getAVPage(1);
  20. //1、添加A3
  21. {
  22. //创建一个可以自动换行的段落
  23. Paragraph paragraph = new Paragraph();
  24. paragraph.setPosition(Position.Absolute)
  25. .setWidth(key.length() * 5.0).setHeight(10D) //设置外接矩形宽高
  26. .setX(A3_X) //设置x坐标
  27. .setY(A3_Y); //设置y坐标
  28. //创建 Span 文本控件对象
  29. Span span = new Span(key);
  30. //设置Span的属性
  31. span.setFontSize(5.0);
  32. span.setColor(0, 0, 0);
  33. //段落添加Span文本控件
  34. paragraph.add(span);
  35. //页面添加段落
  36. page.add(paragraph);
  37. }
  38. //2、添加B3
  39. {
  40. //创建一个可以自动换行的段落
  41. Paragraph paragraph = new Paragraph();
  42. paragraph.setPosition(Position.Absolute)
  43. .setWidth(value.length() * 5.0).setHeight(10D) //设置外接矩形宽高
  44. .setX(B3_X) //设置x坐标
  45. .setY(B3_Y); //设置y坐标
  46. //创建 Span 文本控件对象
  47. Span span = new Span(value);
  48. //设置Span的属性
  49. span.setFontSize(5.0);
  50. span.setColor(0, 0, 0);
  51. //段落添加Span文本控件
  52. paragraph.add(span);
  53. //页面添加段落
  54. page.add(paragraph);
  55. }
  56. }
  57. System.out.println("生成文档位置:" + outP.toAbsolutePath().toString());
  58. }

和3.2结果类似,此处生成了一个新的文档,如下所示:

到此,填充方法演示完成,这些在ofd里其实都是基本的功能。

四、遗留问题
上文提到的模板填充遗留两个问题:第一、填充模板制作;第二、是否支持表单填充;第三、没有日期、图片和图形的填充,各位可以基于此编写相关demo。目前没有开源的模板制作方案,各位有兴趣的同学可以自行研究并开源贡献。
————————————————
版权声明:本文为CSDN博主「阿徐汇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/oAXuHui/article/details/109726036

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号