当前位置: 首页 > 知识库问答 >
问题:

使用iText PdfCopy或PdfSmartCopy组装加盖页面会导致PDF无效

慕容渊
2023-03-14

我使用iText一遍又一遍地在PDF表单上盖印,并尝试将生成的单页PDF编译成一个在RAM中包含许多页的单页PDF,然后在http响应中返回它。不管我做什么,一个无效的PDF都出来了。如果我做同样的事情没有拷贝为一个单一的页面,PDF是完美的。我尝试过使用PdfSmartCopy和PdfCopy,但结果总是无效。我想我正在做的一切就像网上的例子所显示的那样,但我一定是遗漏了什么。谢谢你的建议!

ByteArrayOutputStream mainBaos;
PdfReader reader;
PdfStamper stamp;
AcroFields form;

OutputStream out = null;
try
{
    List<PrintableCheck> checks = service.getChecksToPrint();

    mainBaos = new ByteArrayOutputStream();
    Document doc = new Document();
    PdfSmartCopy mainPDF = new PdfSmartCopy(doc, mainBaos);
    doc.open();

    for (PrintableCheck check : checks)
    {
        reader = new PdfReader(PDF_FILENAME);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        stamp = new PdfStamper(reader, baos);

        form = stamp.getAcroFields();

        form.setField("checkDate", check.getDate());
        form.setField("checkNumber", check.getNumber());
        form.setField("amountAlpha", check.getAmountAlpha());
        form.setField("amount", check.getAmount());

...

        stamp.setFormFlattening(true);
        stamp.close();
        reader.close();

        PdfReader reader2 = new PdfReader(baos.toByteArray());
        PdfImportedPage page = mainPDF.getImportedPage(reader2, 1);
        mainPDF.addPage(page);
        mainPDF.freeReader(reader2);
        reader2.close();
    }

    response.setContentType("application/pdf");
    response.setContentLength(mainBaos.size());
    response.setHeader("Expires", "0");
    response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
    response.setHeader("Pragma", "public");
    response.addHeader("Content-Description", "File Transfer");
    response.addHeader("Content-Disposition", "attachment; filename=checks"
        + bank + "-" + DATE_FORMAT.format(new Date()) + ".pdf");
    response.addHeader("Content-Transfer-Encoding", "binary");
    out = response.getOutputStream();
    doc.close();
    mainBaos.writeTo(out);
    out.flush();
}
catch (Exception e)
{
    log.error("Failed to print checks", e);
}
finally
{
    if (out != null)
    {
        try
        {
            out.close();
        }
        catch (IOException e)
        {
            log.error("Could not close output stream", e);
        }
    }
}

共有1个答案

陆卓
2023-03-14

看看下面这行:

response.setContentLength(mainBaos.size());

您告诉响应您将向浏览器发送多少字节。然而:在那一刻,你还不知道PDF的确切大小,因为你还没有关闭文档。

您可以通过向上移动以下行来解决问题:

doc.close();

这将完成文档。不要在此行之前设置内容长度。

 类似资料:
  • 问题内容: 快速的问题,我已经尝试自己弄清楚这一点,但是在试图弄清页面为什么或如何重新加载以及正在/不应该执行其应做的工作时,使用会话变量可能会造成混淆。 在任何(非脚本)情况下,页面重新加载(使用JavaScript,f5,ctrl + f5,浏览器重新加载按钮等)是否会导致表单重新发布? (这与在C#代码中使用IfPost分支有关,例如下面的示例代码): 我只是需要知道在这里期望什么,以便可以

  • 我们有修改PDF的代码,然后对修改后的PDF进行数字签名。我们使用iTextSharp库(4.1.6)的LGPL版本对PDF进行数字签名。 这是一个显示问题的示例PDF。PDF最初会打开,但随后会冻结,无法导航。无论您是否安装了我们的证书来验证此签名,问题似乎都会发生。 这个问题似乎没有始终如一地发生,问题只存在于Adobe Reader中。浏览器PDF查看器和Foxit Reader(进行签名验

  • 将LTV添加到数字签名后,它显示文档已更改。 参考后:LTV认证签名后,PDF显示“文档已更改” 我对代码进行了更改,它可以很好地用于除此文档以外的所有文档:https://www.sendspace.com/file/3ulwn7-显示无效签名。 我们还使用来自global sign的文档签名服务。 以下代码用于添加LTV: 编辑:我认为我在代码中操作pdf的方式导致了阅读/编写pdf的问题。不

  • 我有一个用飞碟生成的工作PDF。然而,当我现在想添加自定义字体时,生成的PDF会损坏。浏览器没有下载文件,而是显示各种奇怪的符号。 通过在类路径上添加ttf字体文件并调用来添加自定义字体: 并在CSS中指定字体:

  • 问题内容: 我正在尝试使用具有以下代码的iText 7创建PDF文档,并且生成时,我的PDF文档内容在同一页面中重叠(即,在第1页中)。 我看到了 document.newPage(); iText 7中缺少该方法。如何在itext 7中不使用pdfDocumet.copyPages(…)或PDFmerger将页面添加到我的PDF文档中。 问题答案: 在iText 7中,该方法已成为区域中断的特殊

  • 当我hithttp://localhost:4200或http://localhost:4200/forgotPasswordEmail本地环境时,它可以正常工作。 在我的正式生产环境中打开索引页面并单击链接转到另一个页面也可以。但是,当我刷新页面或直接转到