gpt4 book ai didi

java - iText PdfCopy 创建可编辑的 pdf 文档

转载 作者:行者123 更新时间:2023-12-02 10:37:58 25 4
gpt4 key购买 nike

我有一个在 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/

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