【问题标题】:Filling landscape PDF with PDFBox使用 PDFBox 填充横向 PDF
【发布时间】:2013-06-06 02:18:33
【问题描述】:

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

感谢您的帮助。

【问题讨论】:

  • 查看 PDAppearance.java(负责创建外观的类),PDFBox 似乎并未考虑所有与旋转相关的属性。您是否有一个引起问题的示例横向文档?
  • 是的,我有一份横向文档示例。为什么?你有解决这个问题的方法吗?我尝试垂直旋转原始 PDF 以使其纵向放置,但我遇到了同样的问题,因为该字段现在是垂直的,而文本是水平的。
  • 我问是因为有多种方法可以在 PDF 中创建横向文档,我想知道在您的情况下 PDFBox 是否完全忽略了这种方式的一个方面,或者只是在这种情况下的实现中存在错误。
  • 我如何知道它是如何创建的?
  • 如果您可以提供一个引发问题的示例 PDF,其他人可以检查。

标签: java pdf pdfbox


【解决方案1】:

简短的回答

恐怕 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 查看器中旋转。

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

【讨论】:

  • 我设法通过放置表单的背景图像并在其上添加表单域来解决我的问题。不是最干净的方法,但效果很好。我将尝试 iText 以满足我未来的需求。感谢您的帮助。
  • 嗨@mkl,pdfbox 2+对此有任何更新吗?
猜你喜欢
  • 2016-09-29
  • 2013-04-25
  • 2022-08-02
  • 2011-10-15
  • 2016-12-19
  • 2023-03-05
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多