简短的回答
恐怕 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();