gpt4 book ai didi

java - 复制 pdf 时出现 iText 'java.io.IOException The document has no pages'

转载 作者:行者123 更新时间:2023-12-02 04:04:57 56 4
gpt4 key购买 nike

我正在尝试从字节数组复制 pdf,并用单页 pdf 标记每个页面。每次我尝试复制 pdf 并在每一页上盖章时,我都会收到异常 iText 'java.io.IOException 该文档没有页面'

这是我的代码:

public static ByteArrayOutputStream AddPageTemplate(ByteArrayOutputStream baos){    
Document document = getDocument();
ByteArrayOutputStream copyWithTemplateAdded = new ByteArrayOutputStream();

try {
PdfCopy copy = new PdfCopy(document, copyWithTemplateAdded);
PdfWriter writer = PdfWriter.getInstance(document, copyWithTemplateAdded);
PdfReader templateReader = new PdfReader(PAGE_TEMPLATE.getInputStream());
PdfImportedPage templatePage = writer.getImportedPage(templateReader, 1);

document.open();
baos.flush();
PdfReader reader = new PdfReader(baos.toByteArray());
int n1 = reader.getNumberOfPages();
PdfImportedPage page;
PdfCopy.PageStamp stamp;
for (int i = 1; i <= n1; ++i) {
page = copy.getImportedPage(reader, i);
stamp = copy.createPageStamp(page);
stamp.getUnderContent().addTemplate(templatePage, 0, 0);
stamp.alterContents();
copy.addPage(page);
}
copyWithTemplateAdded.close();
reader.close();
copy.close();
templateReader.close();
document.close();
}
catch(DocumentException p){
//todo log error
}
catch (IOException e) {
//todo log error
}
return copyWithTemplateAdded;
}

任何解决此问题的帮助都会很棒。我使用的是itextpdf 5.3.4

最佳答案

您在一个非常短的代码片段中犯了许多不同的错误。

一个错误导致了该错误:您创建了 copyWithTemplateAdded作为ByteArrayOutputStream你使用同样的 OutputStream两位作家:

PdfCopy copy = new PdfCopy(document, copyWithTemplateAdded);
PdfWriter writer = PdfWriter.getInstance(document, copyWithTemplateAdded);

这永远行不通:

  • PdfCopy会将字节写入 OutputStream目的是将现有 PDF 复制到新 PDF。
  • PdfWriter将写入字节到相同 OutputStream目的是从头开始创建一个新的 PDF

结果将是一个完全损坏的 PDF,因为:

  1. 您正在混合 PdfWriterPdfCopy他们都写信给同一个 OutputStream (想想 The Fly 中的杰夫·戈德布鲁姆(Jeff Goldblum),以了解会发生什么)。
  2. 您从 PdfWriter 获取导入的页面(意味着所需的所有引用都将存储在 writer 对象中),但您在 PdfCopy 中使用导入的页面。实例(但 copy 没有对该页面所需资源的任何引用)。

IOException是由于 writer对象已关闭(在 document.close() 上)并且未添加任何内容:所有内容均已添加到 copy 中对象。

另一个错误:你关闭了 copy关闭 document 之前的实例.

但最大的错误是你使用了 PdfCopy (和 PdfWriter )可能应该用 PdfStamper 完成的事情.

您的代码灵感是从哪里获得的?你能帮我下载一下吗Chapter 6 of my book看看StampStationery例子?

public void manipulatePdf(String src, String stationery, String dest)
throws IOException, DocumentException {
// Create readers
PdfReader reader = new PdfReader(src);
PdfReader s_reader = new PdfReader(stationery);
// Create the stamper
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
// Add the stationery to each page
PdfImportedPage page = stamper.getImportedPage(s_reader, 1);
int n = reader.getNumberOfPages();
PdfContentByte background;
for (int i = 1; i <= n; i++) {
background = stamper.getUnderContent(i);
background.addTemplate(page, 0, 0);
}
// CLose the stamper
stamper.close();
reader.close();
s_reader.close();
}

在此示例中,我们有一个现有的 PDF 文件(其路径为 src )和一个要添加为每个页面背景的模板(模板的路径为 stationery )。我们创建一个PdfStamper对象将基于现有 PDF 文档创建新文件(新文件的路径将为 dest )。

我们将模板的第一页加载到PdfImportedPage中(page 对象)。我们遍历每一页并添加 page在后台。该代码直接来自文档,比您编写的代码更容易理解。

关于java - 复制 pdf 时出现 iText 'java.io.IOException The document has no pages',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34421913/

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