gpt4 book ai didi

java - 按顺序合并多个 pdf

转载 作者:行者123 更新时间:2023-12-02 01:56:36 27 4
gpt4 key购买 nike


嘿,伙计们,抱歉,帖子很长,语言不好,还有不必要的细节
我使用 Excel 文档从一个 pdf 模板创建了多个 1 页 pdf
我现在有
类似这样的东西
tempfile0.pdf
临时文件1.pdf
临时文件2.pdf
...
我正在尝试使用itext5将所有文件合并到一个pdf中
但结果pdf中的页面似乎不符合我想要的顺序每个例子
第一页的tempfile0.pdf
临时文件1。 2000页内
这是我使用的代码。
我使用的程序是:
1 从 hashmap 中填充 from
2将填写的表格另存为一个pdf文件
3 将所有文件合并为一个 pdf

public void fillPdfitext(int debut,int fin) throws IOException, DocumentException {


for (int i =debut; i < fin; i++) {
HashMap<String, String> currentData = dataextracted[i];
// textArea.appendText("\n"+pdfoutputname +" en cours de preparation\n ");
PdfReader reader = new PdfReader(this.sourcePdfTemplateFile.toURI().getPath());
String outputfolder = this.destinationOutputFolder.toURI().getPath();
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputfolder+"\\"+"tempcontrat"+debut+"-" +i+ "_.pdf"));
// get the document catalog
AcroFields acroForm = stamper.getAcroFields();
// as there might not be an AcroForm entry a null check is necessary
if (acroForm != null) {
for (String key : currentData.keySet()) {
try {

String fieldvalue=currentData.get(key);
if (key=="ADRESSE1"){
fieldvalue = currentData.get("ADRESSE1")+" "+currentData.get("ADRESSE2") ;
acroForm.setField("ADRESSE", fieldvalue);
}
if (key == "IMEI"){

acroForm.setField("NUM_SERIE_PACK", fieldvalue);

}
acroForm.setField(key, fieldvalue);
// textArea.appendText(key + ": "+fieldvalue+"\t\t");
} catch (Exception e) {
// e.printStackTrace();
}
}
stamper.setFormFlattening(true);
}
stamper.close();
}

}

这是合并的代码

 public void Merge() throws IOException, DocumentException
{
File[] documentPaths = Main.objetapp.destinationOutputFolder.listFiles((dir, name) -> name.matches( "tempcontrat.*\\.pdf" ));
Arrays.sort(documentPaths, NameFileComparator.NAME_INSENSITIVE_COMPARATOR);

byte[] mergedDocument;

try (ByteArrayOutputStream memoryStream = new ByteArrayOutputStream())
{
Document document = new Document();
PdfSmartCopy pdfSmartCopy = new PdfSmartCopy(document, memoryStream);
document.open();

for (File docPath : documentPaths)
{
PdfReader reader = new PdfReader(docPath.toURI().getPath());
try
{
reader.consolidateNamedDestinations();

PdfImportedPage pdfImportedPage = pdfSmartCopy.getImportedPage(reader, 1);
pdfSmartCopy.addPage(pdfImportedPage);

}
finally
{
pdfSmartCopy.freeReader(reader);
reader.close();
}
}

document.close();
mergedDocument = memoryStream.toByteArray();
}



FileOutputStream stream = new FileOutputStream(this.destinationOutputFolder.toURI().getPath()+"\\"+
this.sourceDataFile.getName().replaceFirst("[.][^.]+$", "")+".pdf");
try {
stream.write(mergedDocument);
} finally {
stream.close();
}

documentPaths=null;
Runtime r = Runtime.getRuntime();
r.gc();
}

我的问题是如何在生成的 pdf 中保持文件的顺序相同

最佳答案

这是因为文件命名的问题。你的代码new FileOutputStream(outputfolder + "\\"+ "tempcontrat"+初次亮相 + "-"+ i + "_.pdf")将产生:

  • tempcontrat0-0_.pdf
  • tempcontrat0-1_.pdf
  • ...
  • tempcontrat0-10_.pdf
  • tempcontrat0-11_.pdf
  • ...
  • tempcontrat0-1000_.pdf

其中 tempcontrat0-1000_.pdf 将放置在 tempcontrat0-11_.pdf 之前,因为您在合并之前按字母顺序对其进行排序。

最好使用 leftPad() 留下 0 字符来填充文件编号。 org.apache.commons.lang.StringUtilsjava.text.DecimalFormat 的方法,并像这样 tempcontrat0-000000.pdf,< em>tempcontrat0-000001.pdf,...tempcontrat0-9999999.pdf

<小时/>

您还可以做得更简单,跳过写入文件然后从文件中读取的步骤,并在填写表单后立即合并文档,这样会更快。但这取决于您要合并的文档数量和大小以及您有多少内存。

因此,您可以将填充的文档保存到 ByteArrayOutputStream 中,并在 stamper.close() 之后为该流中的字节创建新的 PdfReader 并调用该读者的pdfSmartCopy.getImportedPage()。简而言之,它看起来像:

// initialize

PdfSmartCopy pdfSmartCopy = new PdfSmartCopy(document, memoryStream);
for (int i = debut; i < fin; i++) {
ByteArrayOutputStream out = new ByteArrayOutputStream();

// fill in the form here

stamper.close();
PdfReader reader = new PdfReader(out.toByteArray());
reader.consolidateNamedDestinations();
PdfImportedPage pdfImportedPage = pdfSmartCopy.getImportedPage(reader, 1);
pdfSmartCopy.addPage(pdfImportedPage);

// other actions ...
}

关于java - 按顺序合并多个 pdf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52204371/

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