【问题标题】:How can I merge the documents consisting PDFs as well as images?如何合并包含 PDF 和图像的文档?
【发布时间】:2021-08-18 23:52:39
【问题描述】:

在我当前的代码中,我正在合并包含 PDF 文件的文档。

public static void appApplicantDownload(File file) {

 Connection con = getConnection();
 Scanner sc = new Scanner(System.in);
 List < InputStream > list = new ArrayList < InputStream > ();
 try {
  OutputStream fOriginal = new FileOutputStream(file, true); // original

  list.add(new FileInputStream(file1));
  list.add(new FileInputStream(file2));
  list.add(new FileInputStream(file3));
  doMerge(list, fOriginal);

 } catch (Exception e) {

 }
}




public static void doMerge(List < InputStream > list, OutputStream outputStream) throws DocumentException, IOException {
 try {
  System.out.println("Merging...");
  Document document = new Document();
  PdfCopy copy = new PdfCopy(document, outputStream);
  document.open();

  for (InputStream in : list) {
   ByteArrayOutputStream b = new ByteArrayOutputStream();
   IOUtils.copy( in , b);
   PdfReader reader = new PdfReader(b.toByteArray());

   for (int i = 1; i <= reader.getNumberOfPages(); i++) {
    copy.addPage(copy.getImportedPage(reader, i));
   }
  }

  outputStream.flush();
  document.close();
  outputStream.close();
 } catch (Exception e) {
  e.printStackTrace();
 }
}

但现在我想更改代码,使其允许合并图像和 PDF。上面的代码给了我 No PDF Signature found

的错误

【问题讨论】:

  • 如果代码应该合并 PDF,您是否希望能够在混合中加入电子表格并使其正常工作?图像也一样,PDF 处理库抱怨你输入的不是 PDF。
  • 是的,我知道,图书馆没有问题,它需要 PDF 签名。我可以将图像转换为图像到 PDF,然后合并。我想知道如何优雅地做到这一点。

标签: java itext


【解决方案1】:

首先,您必须以某种方式知道文件是 PDF 还是图像。最简单的方法是使用文件的扩展名。因此,您将获得文件的扩展名,然后将此信息传递给您的 doMerge 方法。做到这一点,我会改变你目前的方法

public static void doMerge(List<InputStream> list, OutputStream outputStream)

对于类似的东西

public static void doMerge(Map<InputStream, String> files, OutputStream outputStream)

所以每个InputStream 都与一个扩展相关联。

其次,您必须分别加载图像和 pdf。所以你的循环应该是这样的

for (InputStream in : files.keySet()) {
    String ext = files.get(in);

    if(ext.equalsIgnoreCase("pdf"))
    {
        //load pdf here
    }
    else if(ext.equalsIgnoreCase("png") || ext.equalsIgnoreCase("jpg"))
    {
        //load image here
    }
}

在 java 中,您可以使用 ImageIO 轻松加载 Image。有关此主题的更多详细信息,请查看此问题:Load image from a filepath via BufferedImage

然后要将图像添加到 PDF 中,请使用 PdfWriter

PdfWriter pw = PdfWriter.GetInstance(doc, outputStream);
Image img = Image.GetInstance(inputStream);
doc.Add(img);
doc.NewPage();

如果您想在之前将图像转换为 PDF 并在之后合并,您也可以这样做,但您只需先使用 PdfWriter 将它们全部写入。

【讨论】:

  • 好像我们不在同一个页面上。我可以找到哪个是图像,哪个是 PDF。我想知道如何将图像转换为 PDF,然后将 PDF 转换回 InputStream。
  • 我会改用策略模式 (dzone.com/articles/design-patterns-strategy) 但是是的,总体上是相同的想法。
  • 您无法将图像转换为 PDF,您可以将图像放置到 PDF 的页面中。它不像将 JPG 转换为 GIF。
  • @piechuckerr 添加了您正在寻找的答案部分。
【解决方案2】:

在打开的 PDF 文档中新建一个页面,并使用插入图片的功能将图片放置在该页面上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多