原文链接:https://blog.csdn.net/oAXuHui/article/details/109290539
一、OFD前言
OFD文档目前在国内如雨后春笋般出现,这要归功于OFD本身巧妙的版式设计、友好的国标文档《GBT_33190-2016_电子文件存储与交换格式版式文档》和各大开源作者的贡献。目前参与到该版式文档的,除了数科、福析等商业公司之外,还有很多个人开发者的项目值得学习研究,例如:ofdrw、iofd、ofd.js等。OFD应用广泛,目前在税局发票和电子合同应用较多。在可预见的未来,OFD将成为比肩PDF的文档标准。OFD基于xml语言描述,有一定的层级结构,最后打包成zip,扩展名为.ofd,可以直接使用7z进行解压缩,详细描述参考上文提到的国标文档。
二、功能特性
目前PDF支持的业务功能大体有如下几个部分:表单填充,水印填充,签章验章,文档生成,文档修改,文档阅读等。其中,OFD同样支持这些特性,另外,OFD支持附件,目录,大纲,模板,版本等更有意思的特性。本系列文章将对这些特性和功能进行解读和开发。文章基于ofdrw开源软件,git地址:https://github.com/Trisia/ofdrw。
三、本期看点
本期首先对水印填充进行介绍和开发。水印,在OFD里属于注释的一部分,注释有很多种类型,其中一种就是水印,该部分位于《GBT_33190-2016_电子文件存储与交换格式版式文档》第15.1章节,感兴趣的读者可以下载该标准文档进行更详细的了解和学习。
四、代码开发
4.1、引入ofdrw
首先引入ofdrw到maven项目,ofdrw只依赖commons-io包,如下:
junit
junit
4.12
provided
commons-io
commons-io
2.6
provided
org.ofdrw
ofdrw-full
1.6.4
4.2、编写代码
此处代码注意有输入路径和输出路径,我们使用try-with-resource的方式进行编码,使用OFDReader类对文档进行读取,使用OFDDoc类对文档进行修改,同时使用Annotation添加注释,通过OFDDoc把注释添加到对应的页面。代码如下:
/**
* 水印处理
*/
@Test
public void addWatermark() throws IOException {
Path srcP = Paths.get("src/main/resources", "x.ofd");
Path outP = Paths.get("target/AddWatermarkAnnot.ofd");
Path imgPath = Paths.get("src/test/resources", "eg_tulip.jpg");
try (OFDReader reader = new OFDReader(srcP);
OFDDoc ofdDoc = new OFDDoc(reader, outP)) {
Double width = ofdDoc.getPageLayout().getWidth();
Double height = ofdDoc.getPageLayout().getHeight();
Annotation annotation = new Annotation(new ST_Box(0d, 0d, width, height), AnnotType.Watermark, ctx -> {
FontSetting setting = new FontSetting(8, FontName.SimSun.font());
ctx.setFillColor(170, 160, 165)
.setFont(setting)
.setGlobalAlpha(0.4);
//对ofd页面填充8行8列的水印,并顺时针旋转45°
for (int i = 0; i <= 8; i++) {
for (int j = 0; j <= 8; j++) {
ctx.save();
ctx.rotate(45);
ctx.translate(22.4 * i, j * 50);
ctx.fillText("保密资料", 10, 10);
ctx.restore();
}
}
});
ofdDoc.addAnnotation(1, annotation);
ofdDoc.addAnnotation(2, annotation);
ofdDoc.addAnnotation(3, annotation);
}
System.out.println("生成文档位置:" + outP.toAbsolutePath().toString());
}
通过传入ST_Box确定水印的外接矩形,设置注释类型为Watermark并创建一个canvas对象;首先对canvas对象进行简单字体设置,包括填充颜色,字体,透明度等;其次,调用ctx的api进行文字水印添加;该方法设置了文字顺时针45°旋转,当然,熟悉二维变换矩阵的读者也可以调用ctx.transform()方法进行变换;然后设置了偏移量,最后填充文本,然后恢复cavas状态。
通过ofdDoc将刚才创建的注释对象添加到第1,2,3页,此处注意,若不使用try-with-resource的方式进行编码,需主动关闭reader和ofdDoc,reader会对临时文件进行清除,ofdDoc会对新的文档进行jar包,各位可以参考这两个类的close()方法。
4.3、效果示例
下一篇文章我们将对模板填充进行介绍,包括:日期填充,文本填充,图片填充图形填充等内容;再次感谢ofdrw作者,感谢开源。期待OFD版式文档发展得更好。
版权声明:本文为CSDN博主「阿徐汇」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/oAXuHui/article/details/109290539