【问题标题】:JAVA Merge 2 PDF byte arraysJAVA合并2个PDF字节数组
【发布时间】:2021-03-20 00:36:30
【问题描述】:

我收到了两份 PDF,每一份都是一个字节数组。所以现在我有 2 个数组,a[] 和 b[]。 我将它们连接起来并将它们保存到 c[]。 当我将 c[] 转换为 PDF 时,只显示第二个文件。当我检查 c[] 的长度时,它是 len(a[]) + len(b[])。

我发现other questions 针对不同的编程语言对此进行了介绍,他们说我不能像这样将它们连接起来,我们需要使用 PDF 创作库。既然我一开始就收到字节数组,那么在我的情况下还有什么可以工作的吗?

【问题讨论】:

  • 他们是对的。就像连接两个图像的字节不会给出更大的图像一样。但是 PDF 库可能会读取一个字节数组,然后可能会合并两个 PDF 对象。经常有例子。
  • 你可以使用openpdf | github.com/LibrePDF/OpenPDF/wiki/Tutorial 加载两个文档(byteArray),然后合并各个页面。此外,如果您可以使用第三方库,您可以使用 pdfbox,就像这个问题 stackoverflow.com/questions/37589590/…
  • 我们不再保持流程的实时性,而是将其更改为批处理作业,以便处理事情。谢谢你们的时间。当我的领导意识到我们不需要实时进行时,我正在浏览 OpenPDF。

标签: java arrays pdfmerger


【解决方案1】:

您不能只连接字节数组。

您可以在这里找到一些合并 PDF 文件的解决方案 How to merge two PDF files into one in Java?

如果你有PDF文件,你可以使用pdfbox的PDFMergerUtility。

PDFMergerUtility ut = new PDFMergerUtility();
ut.addSource(...);
ut.addSource(...);
ut.addSource(...);
ut.setDestinationFileName(...);
ut.mergeDocuments();

如果 PDF 文件不可用,您可以使用 itext 的其他解决方案

import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfWriter;

/**
 * This class is used to merge two or more 
 * existing pdf file using iText jar.
 */
public class PDFMerger {

   static void mergePdfFiles(List<InputStream> inputPdfList,
                             OutputStream outputStream) throws Exception{
      //Create document and pdfReader objects.
      Document document = new Document();
      List<PdfReader> readers = 
              new ArrayList<PdfReader>();
      int totalPages = 0;

      //Create pdf Iterator object using inputPdfList.
      Iterator<InputStream> pdfIterator = 
          inputPdfList.iterator();

      // Create reader list for the input pdf files.
      while (pdfIterator.hasNext()) {
          InputStream pdf = pdfIterator.next();
          PdfReader pdfReader = new PdfReader(pdf);
          readers.add(pdfReader);
          totalPages = totalPages + pdfReader.getNumberOfPages();
      }

      // Create writer for the outputStream
      PdfWriter writer = PdfWriter.getInstance(document, outputStream);

      //Open document.
      document.open();

      //Contain the pdf data.
      PdfContentByte pageContentByte = writer.getDirectContent();

      PdfImportedPage pdfImportedPage;
      int currentPdfReaderPage = 1;
      Iterator<PdfReader> iteratorPDFReader = readers.iterator();

      // Iterate and process the reader list.
      while (iteratorPDFReader.hasNext()) {
        PdfReader pdfReader = iteratorPDFReader.next();
        //Create page and add content.
        while (currentPdfReaderPage <= pdfReader.getNumberOfPages()) {
              document.newPage();
              pdfImportedPage = 
              writer.getImportedPage(pdfReader,currentPdfReaderPage);
              pageContentByte.addTemplate(pdfImportedPage, 0, 0);
              currentPdfReaderPage++;
        }
        currentPdfReaderPage = 1;
     }

     //Close document and outputStream.
     outputStream.flush();
     document.close();
     outputStream.close();

     System.out.println("Pdf files merged successfully.");
   }

}

【讨论】:

  • 我和我的公司谈过这件事。他们目前不打算为软件许可证付费。我们不再保持流程实时,而是将其更改为批处理作业,这样就可以处理好事情了。感谢您抽出宝贵时间回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多