- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个在 Spring Boot 应用程序中使用的模板 pdf 文件。我需要根据每个请求的用户输入更新此模板中的值。另外,在请求中,我将获得多个 pdf 文件,我需要将这些文件与更新的文件(最终 pdf 的第一页)合并。
我正在将 iText 与 Spring Boot 结合使用。我也可以更新模板中的值并合并文件内容,但最终的 pdf 即将发布,因为文件是隐藏的,可编辑。如果我单击该字段,我可以看到我的值也可以编辑。
public void mergefiles(Map<String, String> tempData,MultipartFile[] userInfoFiles)
throws Exception{
FileOutputStream mergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\updatetem.pdf")); //To update user content to Template
PdfReader reader = new PdfReader(new FileInputStream(new File("C:\\UpdateFile\\template\\template.pdf"))); //Template File Stream
PdfStamper stamper = new PdfStamper(reader, mergeOutStream);
stamper.setFormFlattening(false);
AcroFields form = stamper.getAcroFields();
Map<String, Item> fieldMap = form.getFields();
for (String key : fieldMap.keySet()) {
String fieldValue = dataMap.get(key);
if (fieldValue != null) {
form.setField(key, fieldValue);
}
}
//Above part creates updated pdf with read only
//Below section creates merged file but first page is editable with
//filed values are hidden.
Document mergePdfDoc = new Document();
PdfCopy pdfCopy;
boolean smartCopy = false;
FileOutputStream newmergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\newmerged.pdf"));
if(smartCopy)
pdfCopy = new PdfSmartCopy(mergePdfDoc, newmergeOutStream);
else
pdfCopy = new PdfCopy(mergePdfDoc, newmergeOutStream);
mergePdfDoc.open();
pdfCopy.addDocument(stamper.getReader());
pdfCopy.freeReader(stamper.getReader());
PdfReader[] pdfReader = new PdfReader[userInfoFiles.length];
for(int i=0; i<=userInfoFiles.length-1;i++) {
pdfReader[i] = new PdfReader(userInfoFiles[i].getInputStream());
pdfCopy.addDocument(pdfReader[i]);
pdfCopy.freeReader(pdfReader[i]);
pdfReader[i].close();
}
stamper.close();
mergeOutStream.close();
mergePdfDoc.close();
}
任何输入为什么最终 pdf 处于可编辑形式并且字段值都被隐藏。我必须创建一个合并文档并获取最终文档的 ByteArray 流作为另一个函数调用的输入。我正在使用 iText5。
最佳答案
问题是您将 PdfStamper
所基于的 PdfReader
添加为 PdfCopy
的输入:
pdfCopy.addDocument(stamper.getReader());
压模所使用的读取器是脏的:通过压模应用的一些更改是对读取器所持有的对象进行的,有些仅在压模或其输出中进行。
例如在您的情况下,表单字段已在原始 pdf 中定义。字段值直接添加到该字段。因此,它在读者中发生了变化。但外观、场可视化(包括其当前值的绘图)在添加到压模输出的新间接对象中生成。因此,读者心中仍然存在着原始的、空洞的想象。
因此,在 pdf 查看器中,PdfCopy
结果首先具有空字段的外观(因为外观仅在压模中生成),但在编辑字段时,更改后的值变为可见(因为字段编辑器是使用字段值初始化的)。
要解决此问题,请不要使用脏读取器,而是根据标记结果创建一个新的干净读取器。
首先创建标记文件:
FileOutputStream mergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\updatetem.pdf")); //To update user content to Template
PdfReader reader = new PdfReader(new FileInputStream(new File("C:\\UpdateFile\\template\\template.pdf"))); //Template File Stream
PdfStamper stamper = new PdfStamper(reader, mergeOutStream);
stamper.setFormFlattening(false);
AcroFields form = stamper.getAcroFields();
Map<String, Item> fieldMap = form.getFields();
for (String key : fieldMap.keySet()) {
String fieldValue = dataMap.get(key);
if (fieldValue != null) {
form.setField(key, fieldValue);
}
}
stamper.close();
然后合并:
Document mergePdfDoc = new Document();
PdfCopy pdfCopy;
boolean smartCopy = false;
FileOutputStream newmergeOutStream = new FileOutputStream(new File("C:\\UpdateFile\\mergepath\\newmerged.pdf"));
if(smartCopy)
pdfCopy = new PdfSmartCopy(mergePdfDoc, newmergeOutStream);
else
pdfCopy = new PdfCopy(mergePdfDoc, newmergeOutStream);
mergePdfDoc.open();
PdfReader reader = new PdfReader(new FileInputStream(new File("C:\\UpdateFile\\mergepath\\updatetem.pdf")));
pdfCopy.addDocument(reader);
pdfCopy.freeReader(reader);
PdfReader[] pdfReader = new PdfReader[userInfoFiles.length];
for(int i=0; i<=userInfoFiles.length-1;i++) {
pdfReader[i] = new PdfReader(userInfoFiles[i].getInputStream());
pdfCopy.addDocument(pdfReader[i]);
pdfCopy.freeReader(pdfReader[i]);
pdfReader[i].close();
}
mergeOutStream.close();
mergePdfDoc.close();
}
关于java - iText PdfCopy 创建可编辑的 pdf 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53141565/
我目前正在尝试迭代现有的 PDF 并使用 OnPageEnd 事件在每个页面上标记一些页脚文本,如 iText 文档中所述,Chapter 5: Table, cell, and page event
我正在尝试使用 ItextSharp 中的 PdfSmartCopy,但我在 C# 中找不到任何相关示例。 我的想法是我有一个包含表单字段的 pdf,并且这些字段将 700kb 添加到 pdf 文档的
我正在使用 iText(特别是 iTextSharp 4.1.6),我想通过组合现有 PDF 中的页面来创建 PDF,同时插入从图像创建的新页面。 我分别使用 PdfCopy 和 PdfWriter
当我使用 pdfcopy 创建 pdf 时,返回到客户端的 pdf 为空或只有 1 行,但是当我在资源管理器上打开它时,它包含我合并的所有数据,我使用 itextsharp 5 这是我进行合并的地方:
我有一个在 Spring Boot 应用程序中使用的模板 pdf 文件。我需要根据每个请求的用户输入更新此模板中的值。另外,在请求中,我将获得多个 pdf 文件,我需要将这些文件与更新的文件(最终 p
我需要将多个 pdf(每个单页)添加到我的主 pdf。这些需要添加到特定页码之后,而不是附加到末尾。 我该怎么办 1:在特定页码处合并pdf 2:pdfCopy.AddDocument 不可用。我已经
我正在研究使用 iText 5.4.5 合并一些输入 PDF 文档的任务。输入文档可能包含也可能不包含 AcroForms,我也想合并表单。 我正在使用找到的示例 pdf 文件 here这是代码示例:
iText 实际操作的第 6 章介绍了如何使用 PdfSmartCopy/PdfCopy 复制页面: public void addDataSheets(PdfCopy copy) t
我想合并两个 PDF 文件(仅选定的页面)并向它们添加自定义页眉和页脚。 因此我不使用 PdfCopy 只是复制页面而不改变它。我使用 PdfWriter。 问题是我不知道如何使用 PdfWriter
我正在使用 iText 一遍又一遍地标记 PDF 表单,并尝试将生成的单页 pdf 编译成一个 pdf,在 RAM 中有许多页面,并在 http 响应中返回它。无论我做什么,都会出现无效的 PDF。如
这个问题已经有答案了: Is it possible to merge several pdfs using iText7 (7 个回答) 已关闭 4 年前。 我正在尝试在 java 项目中连接两个不
在 iText 5.4.4 的发行说明中,它说: From now on you can now merge forms and preserve the tagged PDF structure w
我是一名优秀的程序员,十分优秀!