gpt4 book ai didi

java - 尝试使用 iText 生成可变页面 PDF 时出现异常

转载 作者:行者123 更新时间:2023-11-30 04:23:11 25 4
gpt4 key购买 nike

我正在尝试创建一个自动填充的政府工资表 PDF,其中可能涉及可变页数。我目前将每个页面存储为 map ,键是字段的名称,值是其内容。目前,我有这样的代码:

in = new FileInputStream(inputPDF);
PdfCopyFields adder = new PdfCopyFields(outStream);
PdfReader reader = null;
PdfStamper stamper = null;
ByteArrayOutputStream baos = null;
for (int pageNum = 0; pageNum < numPages; pageNum++) {
reader = new PdfReader(in);
baos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, baos);
AcroFields form = stamper.getAcroFields();
Map<String, String> page = pages.get(pageNum);
setFieldsToPage(form, pageNum);
populatePage(form, page, pageNum);
stamper.close();
reader = new PdfReader(baos.toByteArray());
adder.addDocument(reader);
}

调用的方法有:

private void populatePage(AcroFields form, Map<String, String> pageMap, int pageNum) throws Exception {
ArrayList<String> fieldNames = new ArrayList<String>();
for (String key : pageMap.keySet()) {
fieldNames.add(key);
}
for (String key : fieldNames) {
form.setField(key + pageNum, pageMap.get(key));
}
}

private void setFieldsToPage(AcroFields form, int pageNum) {
ArrayList<String> fieldNames = new ArrayList<String>();
Map<String, AcroFields.Item> fields = form.getFields();
for (String fieldName : fields.keySet()) {
fieldNames.add(fieldName);
}
for (String fieldName : fieldNames) {
form.renameField(fieldName, fieldName + pageNum);
}
}

问题是,这会在循环的第二次迭代中引发异常:在 reader = new PdfReader(in); 我收到以下异常:java.io.IOException:未找到 PDF header 签名。 我在这里做错了什么,如何修复它?

编辑:这是异常(exception)情况:

java.io.IOException: PDF header signature not found.
at com.lowagie.text.pdf.PRTokeniser.checkPdfHeader(Unknown Source)
at com.lowagie.text.pdf.PdfReader.readPdf(Unknown Source)
at com.lowagie.text.pdf.PdfReader.<init>(Unknown Source)
at com.lowagie.text.pdf.PdfReader.<init>(Unknown Source)

顺便说一句,如果格式不好,我很抱歉 - 这是我第一次使用 stackoverflow。

最佳答案

您的问题是,您本质上尝试多次读取相同的输入流,而它在第一次之后就已经位于其末尾:

in = new FileInputStream(inputPDF);
[...]
for (int pageNum = 0; pageNum < numPages; pageNum++) {
reader = new PdfReader(in);
[...]
}

在第一次迭代中读取整个流;因此,在第二个中 new PdfReader(in) 本质上尝试解析一个空文件,从而导致您的

java.io.IOException: PDF header signature not found

您可以通过每次直接使用输入文件路径构造 PdfReader 来解决此问题:

for (int pageNum = 0; pageNum < numPages; pageNum++) {
reader = new PdfReader(inputPDF);
[...]
}

还有两件事:

  • 使用后不要关闭 PdfReader 实例。在最新的 iText 版本中,隐式关闭阅读器已从代码中删除,因为它与许多用例发生冲突。因此,在完成对阅读器的使用后(这包括使用该阅读器的任何压模等也已关闭),您应该显式关闭阅读器。

  • 一般来说,如果您的文件系统中已有 PDF,则通过 FileInputStream 打开 PdfReader 是非常浪费资源的 -- 使用输入初始化的阅读器流首先将该流完全读取到内存中(byte[]),然后解析内存中的表示;使用文件路径初始化的读取器直接解析光盘上的表示。

关于java - 尝试使用 iText 生成可变页面 PDF 时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16491399/

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