如何使用itext将两个PDF文件与附件合并?

时间:2016-06-14 06:26:14

标签: itext

我正在尝试将两个pdf文件(file1.pdf和file2.pdf)合并到一个文件file3.pdf中。其中一个源文件,file2.pdf几乎没有附件。

使用PdfCopyFields addDocument方法不会将源pdf文件中的附件包含到目标pdf文件中。我该如何实现这一目标?

使用PdfDictionary从源文件中提取文档级附件,并使用PdfWriter addFileAttachment方法将它们添加到目标文件中。

在合并后是否还有其他有效方法可以将源pdf文件中的附件包含在目标pdf文件中,是否可以告诉我?

这是我用来复制场景的示例代码。

public class TestItext
{
    public String[] attachments;
    public TestItext()
    {
        attachments = new String[2];
    }

public static void main(String[] args)
{
    try
    {           
        TestItext obj = new TestItext();
        obj.extractDocLevelAttachments("C:\\source.pdf");

        obj.addAttachments("C:\\source.pdf","C:\\temp\\dest.pdf");
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

public void extractDocLevelAttachments(String filename) throws IOException 
{
    PdfReader reader = new PdfReader(filename);
    PdfDictionary root = reader.getCatalog();
    PdfDictionary documentnames = root.getAsDict(PdfName.NAMES);
    PdfDictionary embeddedfiles = documentnames.getAsDict(PdfName.EMBEDDEDFILES);
    PdfArray filespecs = embeddedfiles.getAsArray(PdfName.NAMES);
    PdfDictionary filespec;
    PdfDictionary refs;
    FileOutputStream fos;
    PRStream stream;
    int count = 0;
    for (int i = 0; i < filespecs.size(); ) {
      filespecs.getAsString(i++);
      filespec = filespecs.getAsDict(i++);
      refs = filespec.getAsDict(PdfName.EF);

      for (Object key : refs.getKeys()) {

        fos = new FileOutputStream(String.format("C:\\temp\\"+ filespec.getAsString((PdfName)key).toString()));
        attachments[count++] = String.format("C:\\temp\\"+ filespec.getAsString((PdfName)key).toString());
        stream = (PRStream) PdfReader.getPdfObject(refs.getAsIndirectObject((PdfName)key));
        fos.write(PdfReader.getStreamBytes(stream));
        fos.flush();
        fos.close();
      }
    }
    reader.close();
}
public void addAttachments(String src, String dest) throws IOException, DocumentException 
{
  PdfReader reader = new PdfReader(src);
  PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
  for (int i = 0; i < attachments.length; i++) {
    addAttachment(stamper.getWriter(), new File(attachments[i]));
  }
  stamper.close();
}

protected void addAttachment(PdfWriter writer, File src) throws IOException {
  PdfFileSpecification fs =
    PdfFileSpecification.fileEmbedded(writer, src.getAbsolutePath(), src.getName(), null);
  writer.addFileAttachment(src.getName().substring(0, src.getName().indexOf('.')), fs);
}

}

0 个答案:

没有答案