如何合并包含PDF和图像的文档?

时间:2017-05-17 16:37:03

标签: java itext

在我目前的代码中,我正在合并包含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();
 }
}

但是现在我想更改代码,以便它允许合并Image和PDF。上面的代码给出了没有找到PDF签名

的错误

2 个答案:

答案 0 :(得分:2)

首先,你必须知道文件是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中,您可以使用Image轻松加载ImageIO。有关此主题的更多详细信息,请查看此问题: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将它们全部写入。

答案 1 :(得分:0)

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