3

我尝试使用 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 文档?

谢谢你的帮助。

4

1 回答 1

2

简短的回答

恐怕 PDFBox 还没有(从 1.8.2 版开始)允许您填写您提供的横向 PDF,因为它似乎没有查询和考虑有关表单字段所在页面的信息。

长答案

您可以通过多种方式将页面定义为 A4 横向:

  1. 您可以通过媒体框定义直接将其定义为具有 A4 横向尺寸:

    /MediaBox [0, 0, 842, 595]
    

    在这种情况下,您的坐标aAddressLine1将是

    /Rect[23.1711 86.8914 292.121 100.132]
    
  2. 或者您可以将其定义为具有 A4 纵向尺寸并旋转 90°(或显然是 270°):

    /MediaBox [0, 0, 595, 842]
    /Rotate 90
    

    在这种情况下,您的坐标aAddressLine1

    /Rect[86.8914 23.1711 100.132 292.121]
    

您的示例文档使用后一种方法。

现在 PDFBox 在为该字段创建外观流时,只查看定义字段的矩形,而忽略页面的属性。因此,PDFBox 会看到一个非常窄且非常高的文本字段并像这样填充它。它完全不知道结果将在 PDF 查看器中旋转。

用 PDFBox 填充的字段

它应该做的是还查看该字段所在的页面。如果该页面有/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 填充的字段

(免费的 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();

充满 PDF 小丑的字段

于 2013-06-07T12:45:46.767 回答