Java 函数,该函数可以使用iText将PDF连接/合并在一起-导致一些问题

Java 函数,该函数可以使用iText将PDF连接/合并在一起-导致一些问题,java,pdf,itext,Java,Pdf,Itext,我使用以下代码使用iText将PDF合并在一起: public static void concatenatePdfs(List<File> listOfPdfFiles, File outputFile) throws DocumentException, IOException { Document document = new Document(); FileOutputStream outputStream = new FileOutputSt

我使用以下代码使用iText将PDF合并在一起:

public static void concatenatePdfs(List<File> listOfPdfFiles, File outputFile) throws DocumentException, IOException {
        Document document = new Document();
        FileOutputStream outputStream = new FileOutputStream(outputFile);
        PdfWriter writer = PdfWriter.getInstance(document, outputStream);
        document.open();
        PdfContentByte cb = writer.getDirectContent();
        for (File inFile : listOfPdfFiles) {
            PdfReader reader = new PdfReader(inFile.getAbsolutePath());
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                document.newPage();
                PdfImportedPage page = writer.getImportedPage(reader, i);
                cb.addTemplate(page, 0, 0);
            }
        }
        outputStream.flush();
        document.close();
        outputStream.close();
    }
public static void concatenatePdfs(List listopfdffiles,File outputFile)抛出DocumentException,IOException{
文档=新文档();
FileOutputStream outputStream=新的FileOutputStream(outputFile);
PdfWriter writer=PdfWriter.getInstance(文档,outputStream);
document.open();
PdfContentByte cb=writer.getDirectContent();
用于(文件填充:ListOffDFFiles){
PdfReader reader=新的PdfReader(infle.getAbsolutePath());

对于(int i=1;i有时会出现错误,因为您使用了错误的方法连接文档。请阅读,您会注意到使用
PdfWriter
连接(或合并)PDF文档是错误的:

  • 您完全忽略原始文档中页面的页面大小(假设它们都是A4大小)
  • 忽略页面边界,例如裁剪框(如果存在)
  • 忽略页面字典中存储的旋转值,
  • 您放弃了原始文档中存在的所有交互性,依此类推
使用
PdfCopy
连接PDF,请参见示例:


在中还有其他示例。

如果有人在使用上面Bruno Lowagie的正确答案查找它,下面是该函数的版本,它似乎没有我上面描述的翻页问题:

public static void concatenatePdfs(List<File> listOfPdfFiles, File outputFile) throws DocumentException, IOException {
        Document document = new Document();
        FileOutputStream outputStream = new FileOutputStream(outputFile);
        PdfCopy copy = new PdfSmartCopy(document, outputStream);
        document.open();
        for (File inFile : listOfPdfFiles) {
            PdfReader reader = new PdfReader(inFile.getAbsolutePath());
            copy.addDocument(reader);
            reader.close();
        }
        document.close();
}
public static void concatenatePdfs(List listopfdffiles,File outputFile)抛出DocumentException,IOException{
文档=新文档();
FileOutputStream outputStream=新的FileOutputStream(outputFile);
PdfCopy copy=新的PdfSmartCopy(文档、输出流);
document.open();
用于(文件填充:ListOffDFFiles){
PdfReader reader=新的PdfReader(infle.getAbsolutePath());
副本。添加文件(读卡器);
reader.close();
}
document.close();
}

我从itext名称空间中认出了你的名字。你是itext库的创始人吗?是的,我就是那个Lowagie;-)问题-在我的itext版本中不存在copy.addDocument。我太老了吗?5.0.6yep 5.5.0工作正常。我以为我从maven repository中获取了最新版本,但当我转到copy paste.crap时,我不小心单击错误。是的,
document.close()
还关闭
PdfWriter
实例和写入程序使用的
OutputStream
。您可以使用
writer.setCloseStream(false);
。例如:如果您有一个要添加多个PDF的
zipoutpstream
,则不希望iText关闭该流。
public static void concatenatePdfs(List<File> listOfPdfFiles, File outputFile) throws DocumentException, IOException {
        Document document = new Document();
        FileOutputStream outputStream = new FileOutputStream(outputFile);
        PdfCopy copy = new PdfSmartCopy(document, outputStream);
        document.open();
        for (File inFile : listOfPdfFiles) {
            PdfReader reader = new PdfReader(inFile.getAbsolutePath());
            copy.addDocument(reader);
            reader.close();
        }
        document.close();
}