在JAVA中将(一组)PDF文档合并(服务器端)成一个大PDF文档的最简单方法是什么
时间:2020-03-06 14:20:07 来源:igfitidea点击:
我有3个PDF文档,这些文档由我们使用的遗留库即时生成,并已写入磁盘。我的JAVA服务器代码最简单的方法是获取这3个文档并将它们转换为一个长PDF文档,在这里它只是文档#1中的所有页面,然后是文档#2中的所有页面,等等。
理想情况下,我希望这种情况在内存中发生,因此我可以将其作为流返回给客户端,但是也可以将其写入磁盘。
解决方案
我使用pdftk效果很好。这是一个外部应用程序,我们必须从Java应用程序中运行。
看一下Java开源PDF库列表。
另请参阅本文。
[编辑:总是有Ghostscript,它易于使用,但是谁想要更多的依赖项?]
@J D OConal,感谢提示,我们发送给我的文章非常过时,但这的确使我了解了iText。我找到了此页面,该页面解释了如何完全执行我需要的操作:
http://java-x.blogspot.com/2006/11/merge-pdf-files-with-itext.html
感谢我们提供其他答案,但是如果可以避免的话,我真的不想产生其他流程,而且我们的项目已经有了itext.jar,因此我不会添加任何外部依赖
这是我最终编写的代码:
public class PdfMergeHelper { /** * Merges the passed in PDFs, in the order that they are listed in the java.util.List. * Writes the resulting PDF out to the OutputStream provided. * * Sample Usage: * List<InputStream> pdfs = new ArrayList<InputStream>(); * pdfs.add(new FileInputStream("/location/of/pdf/OQS_FRSv1.5.pdf")); * pdfs.add(new FileInputStream("/location/of/pdf/PPFP-Contract_Genericv0.5.pdf")); * pdfs.add(new FileInputStream("/location/of/pdf/PPFP-Quotev0.6.pdf")); * FileOutputStream output = new FileOutputStream("/location/to/write/to/merge.pdf"); * PdfMergeHelper.concatPDFs(pdfs, output, true); * * @param streamOfPDFFiles the list of files to merge, in the order that they should be merged * @param outputStream the output stream to write the merged PDF to * @param paginate true if you want page numbers to appear at the bottom of each page, false otherwise */ public static void concatPDFs(List<InputStream> streamOfPDFFiles, OutputStream outputStream, boolean paginate) { Document document = new Document(); try { List<InputStream> pdfs = streamOfPDFFiles; List<PdfReader> readers = new ArrayList<PdfReader>(); int totalPages = 0; Iterator<InputStream> iteratorPDFs = pdfs.iterator(); // Create Readers for the pdfs. while (iteratorPDFs.hasNext()) { InputStream pdf = iteratorPDFs.next(); PdfReader pdfReader = new PdfReader(pdf); readers.add(pdfReader); totalPages += pdfReader.getNumberOfPages(); } // Create a writer for the outputstream PdfWriter writer = PdfWriter.getInstance(document, outputStream); document.open(); BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED); PdfContentByte cb = writer.getDirectContent(); // Holds the PDF // data PdfImportedPage page; int currentPageNumber = 0; int pageOfCurrentReaderPDF = 0; Iterator<PdfReader> iteratorPDFReader = readers.iterator(); // Loop through the PDF files and add to the output. while (iteratorPDFReader.hasNext()) { PdfReader pdfReader = iteratorPDFReader.next(); // Create a new page in the target for each source page. while (pageOfCurrentReaderPDF < pdfReader.getNumberOfPages()) { document.newPage(); pageOfCurrentReaderPDF++; currentPageNumber++; page = writer.getImportedPage(pdfReader, pageOfCurrentReaderPDF); cb.addTemplate(page, 0, 0); // Code for pagination. if (paginate) { cb.beginText(); cb.setFontAndSize(bf, 9); cb.showTextAligned(PdfContentByte.ALIGN_CENTER, "" + currentPageNumber + " of " + totalPages, 520, 5, 0); cb.endText(); } } pageOfCurrentReaderPDF = 0; } outputStream.flush(); document.close(); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (document.isOpen()) { document.close(); } try { if (outputStream != null) { outputStream.close(); } } catch (IOException ioe) { ioe.printStackTrace(); } } } }
iText PdfCopy