gpt4 book ai didi

java - 用 PDFBox 填充横向 PDF

转载 作者:行者123 更新时间:2023-11-30 11:31:56 26 4
gpt4 key购买 nike

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

感谢您的帮助。

最佳答案

简短的回答

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

Fields filled with PDFBox

它应该做的是同时查看该字段所在的页面。如果该页面有一个 /Rotate 条目,它应该为显示以相反方向旋转的文本的字段创建外观流。

备选方案

在评论中你也问过

Do you know another library I could use if PDFBox can't do what I want?

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

Fields filled with 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();

Fields filled with PDF Clown

关于java - 用 PDFBox 填充横向 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16952710/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com