使用pdfbox填充横向pdf

x4shl7ld  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(649)

我试着用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文档?
谢谢你的帮助。

hvvq6cgz

hvvq6cgz1#

简短的回答
恐怕pdfbox(从1.8.2版开始)还不允许您像您提供的那样填写横向PDF,因为它似乎没有查询和考虑表单字段所在页面的信息。
长话短说
您可以使用不同的方式定义要创建的页面:
您可以通过媒体盒定义直接将其定义为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小丑0.1.3( Backbone.js 版本),它也不起作用:

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();

相关问题