gpt4 book ai didi

java - 使用 PDFBox 渲染包含填充表单字段的文档适用于 1.8.2,但不适用于 2.0.2

转载 作者:行者123 更新时间:2023-12-01 09:37:40 29 4
gpt4 key购买 nike

我的目标是打开 PDF 文档,填写一些表单字段,然后将其渲染为图像。我使用 PDFBox 和 Java 来做到这一点。我开始使用版本 2.0.2(最新)并且填写表单字段有效。当我保存它然后用 PDF 阅读器打开它时,表单字段具有值。但是当我将其渲染为图像时,表单字段有黑色边框,内部没有文本。然后我在 1.8.12 上尝试了同样的操作,它有效。不过,我真的很想使用 2.x 中的新功能。

  • PDF 只有 AcroForms,没有 XFA(或者至少我这么认为)。当我调用 PDAcroForm.getXFA() 时,它返回 null。
  • 使用 2.0.2,如果我使用 setValue 渲染填充的内容,则渲染看起来会损坏。然而,使用 Adob​​e Reader 渲染填充的内容是可行的。这两种情况都可以使用 1.8。
  • 在 2.0.2 中,我尝试了 PDAcroForm.refreshAppearances() 和/或 PDAcroForm.setNeedAppearances(true) 的任意组合。 1.8 中没有这些方法。

我用来使用 1.8.12 进行渲染的代码:

public class Main {
public static void main(String[] args) throws Exception {
PDDocument doc = PDDocument.loadNonSeq(new File("test.pdf"), null);
doc.setAllSecurityToBeRemoved(true);
PDDocumentCatalog cat = doc.getDocumentCatalog();
PDAcroForm form = cat.getAcroForm();
for (Object _field : form.getFields()) {
PDField field = (PDField) _field;
System.out.println(field.getFullyQualifiedName());
field.setValue(field.getFullyQualifiedName());
}

List<PDPage> pdPages = doc.getDocumentCatalog().getAllPages();
int page = 0;
for (PDPage pdPage : pdPages) {
++page;
BufferedImage bim = pdPage.convertToImage(BufferedImage.TYPE_INT_RGB, 96);
ImageIOUtil.writeImage(bim, "rendered" + "-" + page + ".png", 96);
}
doc.close();
}
}

我用来使用 2.0.2 进行渲染的代码:

public class Main {
public static void main(String[] args) throws Exception {
PDDocument doc = PDDocument.load(new File("test.pdf"));
doc.setAllSecurityToBeRemoved(true);
PDDocumentCatalog cat = doc.getDocumentCatalog();
PDAcroForm form = cat.getAcroForm();
for (PDField field : form.getFields()) {
System.out.println(field.getFullyQualifiedName());
if (field instanceof PDTextField) {
field.setValue(field.getFullyQualifiedName());
}
}
// Doesn't work with or without these
form.setNeedAppearances(true);
form.refreshAppearances();

PDDocument renderDoc = doc;
PDFRenderer pdfRenderer = new PDFRenderer(renderDoc);
for (int page = 0; page < renderDoc.getNumberOfPages(); ++page) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 96, ImageType.RGB);
ImageIOUtil.writeImage(bim, "rendered" + "-" + (page + 1) + ".png", 96);
}
}
}

使用 1.8.12 渲染的正确版本:Correct rendering with 1.8.12

使用 2.0.2 呈现的错误版本:Bad version rendering with 2.0.2

最佳答案

这是 PDFBox 2.0.2 中的一个错误。 2.0.4已解决,解决办法是升级版本到最新。

关于java - 使用 PDFBox 渲染包含填充表单字段的文档适用于 1.8.2,但不适用于 2.0.2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38724499/

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