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

使用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中,该方法已成为区域中断的特殊

  • 背景:公司的A系统使用iframe嵌入了B系统的页面,因为跨域问题,所以我们使用了A所在的apache服务器反向代理了B系统的所在的weblogic服务器,从而使得A系统和B系统处在同一个域。 问题:B系统每次上线,重新部署到weblogic服务器之后,部分用户在A系统通过iframe打开B系统都会iframe加载不出来,但是清理浏览器缓存之后就可以正常打开了。 其它: 因为用户只反馈了这个BUG