阅读此文请先查看昨天的更新任重到远,从word到pdf的路
昨天还遗留了一个问题,就是word这中的选中框转换到pdf之后,不能正常显示。这是原始的WORD
转换之后的pdf如图
经过调研之后,发现昨天说的通过PDFBOX定位到0052的字符串,将其替换成选中的框,基本的方向是对的。
第一步:定位每个0052的0的位置
第二步:用画笔工具清除掉0052
第三步:用画笔工具画一个带边框的正方形,及打勾的形状
具体代码主要是用到了PDFTextStripper,PDPageContentStream两个类。
PDFTextStripper:它是一个专门拆解PDF中文本的解释器,能将每个汉字,符号或者数字,字母一一分开,并能打标相应的属性,这里面有字符的X,Y坐标,字体大小,字的高度,宽度等。你只需要继承这个类,实现writeString的方法
PDPageContentStream:顾名思义,它是一个处理PDF内容的对象,传入当前的PAGE对象之后,以追加模式执行上面的第一,二,三
截图中相关数字说明:
23:表示第四个字符5结束时相对于第一个字符0的向右偏移量
8:表示白色填充框,黑色边框的高度
10:表示新的黑色框绘制起点相对于第一个字符0的向右偏移量
12:表示打勾的起点相对于新的黑色框绘制起点的向右偏移量
4:表示打勾的起点垂直方向上在黑色框的向上偏移量
14:表示打勾转折的点相对于新的黑色框绘制起点的向右偏移量
2:表示打勾的起点垂直方向上在黑色框的的向上偏移量
18:表示打勾结束点水平方向相对于第一个字符0的向右偏移量
最后贴一个处理好的
华丽的分割线是我
最近在做新的业务文档生成时,如果文档里面的字体存在多个子集时,你不做任何处理,docx4j转pdf直接报
For TrueType collection you must specify which font to select (-ttcname)
打个比方,比如你比较幸运的用到了宋体simsun.ttc,这个字体比较特殊,它会有simsun,nsimsun等字体,当不指定某一个子集,PDF转换就会失败。由于docx4j转 pdf是基于FOP:
Apache™ FOP (Formatting Objects Processor) is a print formatter driven by XSL formatting objects (XSL-FO) and an output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PS, PCL, AFP, XML (area tree representation), Print, AWT and PNG, and to a lesser extent, RTF and TXT. The primary output target is PDF.
在它的官网的源代码里面,我找到了可以生成子集文件的方法:
在参考了它的配置文件说明之后config
我自己的XML文件如图
宋体终于可以正常显示了,由于WORD的格式比PDF要复杂,还有些小细节需要再处理一下。