gpt4 book ai didi

java - 使用 iText PdfCopy 或 PdfSmartCopy 组装戳记页面导致无效 PDF

转载 作者:行者123 更新时间:2023-11-30 09:01:32 26 4
gpt4 key购买 nike

我正在使用 iText 一遍又一遍地标记 PDF 表单,并尝试将生成的单页 pdf 编译成一个 pdf,在 RAM 中有许多页面,并在 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);
}
}
}

最佳答案

看看下面这行:

response.setContentLength(mainBaos.size());

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

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

doc.close();

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

关于java - 使用 iText PdfCopy 或 PdfSmartCopy 组装戳记页面导致无效 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26375412/

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