我尝试使用PDFBox填写PDF表单,并设法使用纵向文档完成。但是在横向模式下填写文档时遇到问题。字段已填满,但文字方向不佳。它看起来像是垂直的,如果它仍然是纵向的,但旋转了90度。
这是我的简化代码:
PDDocument pdfDoc = PDDocument.load(MY_FILE);
PDDocumentCatalog docCatalog = pdfDoc.getDocumentCatalog();
PDAcroForm acroForm = docCatalog.getAcroForm();
acroForm.getField("aAddressLine1").setValue("ADDRESS1_HERE");
acroForm.getField("aAddressLine2").setValue("ADDRESS1_HERE");
acroForm.getField("country").setValue("COUNTRY_HERE");
pdfDoc.save(PATH_HERE);
pdfDoc.close();
您是否设法以横向模式填写PDF文档?
感谢您的帮助。
答案 0 :(得分:1)
简短回答
我担心PDFBox还没有(从版本1.8.2开始)允许你填写像你提供的那样的横向PDF,因为它似乎没有查询和考虑有关表单字段所在页面的信息上。
答案很长
您可以通过不同的方式将页面定义为A4横向:
您可以通过媒体框定义直接定义A4横向尺寸:
/MediaBox [0, 0, 842, 595]
在这种情况下,aAddressLine1
的坐标为
/Rect[23.1711 86.8914 292.121 100.132]
或者您可以将其定义为具有A4纵向尺寸并旋转90°(或明显270°):
/MediaBox [0, 0, 595, 842]
/Rotate 90
在这种情况下,aAddressLine1
的坐标为
/Rect[86.8914 23.1711 100.132 292.121]
您的示例文档使用后一种方法。
现在,PDFBox在为该字段创建外观流时,只查看定义该字段的矩形,但忽略该页面的属性。因此,PDFBox看到了一个非常狭窄和非常高的文本字段,就像那样填充它。完全没有意识到结果将在PDF查看器中旋转。
它应该做的是查看该字段所在的页面。如果该页面具有 / Rotate 条目,则应为该字段创建一个外观流,以显示以相反方向旋转的文本。
替代
在评论中你也问了
如果PDFBox不能做我想做的事,你知道我可以使用的另一个库吗?
我已使用iText 5.4.2测试了该专长:
PdfReader reader = new PdfReader(MY_FILE);
OutputStream os = new FileOutputStream(PATH_HERE);
PdfStamper stamper = new PdfStamper(reader, os);
AcroFields acroFields = stamper.getAcroFields();
acroFields.setField("aAddressLine1", "ADDRESS1_HERE");
acroFields.setField("aAddressLine2", "ADDRESS1_HERE");
stamper.close();
(免费的iText版本是根据AGPL许可的;您必须决定这是否适用于您的项目。如果不合适,还有商业许可证。)
我确信其他PDF库也可以做到这一点,毕竟它不是太奇特了...
但我也测试了PDF Clown 0.1.3(主干版本),它也不起作用:
File file = new File(MY_FILE);
Document document = file.getDocument();
Form form = document.getForm();
form.getFields().get("aAddressLine1").setValue("ADDRESS1_HERE");
form.getFields().get("aAddressLine2").setValue("ADDRESS1_HERE");
file.save(new java.io.File(PATH_HERE), SerializationModeEnum.Incremental);
file.close();