使用PDFBox填充横向PDF

时间:2013-06-06 02:18:33

标签: java pdf pdfbox

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

感谢您的帮助。

1 个答案:

答案 0 :(得分: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]
    
  3. 您的示例文档使用后一种方法。

    现在,PDFBox在为该字段创建外观流时,只查看定义该字段的矩形,但忽略该页面的属性。因此,PDFBox看到了一个非常狭窄和非常高的文本字段,就像那​​样填充它。完全没有意识到结果将在PDF查看器中旋转。

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

    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