Java 函数,该函数可以使用iText将PDF连接/合并在一起-导致一些问题
我使用以下代码使用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
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();
}