2012-08-14 151 views
2

如何将文件附加到现有pdf中,包括主页上附件的链接?将附件添加到pdf文件并附上链接

我正在使用Itext,至今只设置了文档级别。

+0

这个代码你是说你如何合并到PDF文档到一个? – 2012-08-14 08:26:32

+0

@Aaron Digulla不,我想将文件附加到现有的pdf文件,并在主页面或超链接上以图标形式给出附加链接。 – 2012-08-14 08:33:14

+0

以下链接可能有帮助,请检查。 http://itextpdf.com/examples/iia.php?id=289 – likeToCode 2012-08-14 08:36:58

回答

4

使用下面的代码来创建一个附件, 请扔掉我只花了几分钟的代码,了解 它并删除不必要的代码。

有一个RESOURCE变量指向您要附加的所有 pdf或文件。 在这种情况下,它是public static final String RESOURCE =“chapter16 /%s.pdf”;

凡16章文件夹中有你想要的PDF格式的附 和%s将与您提供与文件的名称来代替 文件格式是.PDF(如果要连接一个PDF文件)

它在我的系统中工作和测试。我refered从here

// I create the list which has the list of files names i want to attach 
ArrayList<String> strList = new ArrayList<String>(); 
strList.add("Strings"); // its the same file I'm attaching four times 
strList.add("Strings"); // where "Strings" is the name of the file 
strList.add("Strings"); 
strList.add("Strings"); 

import java.io.ByteArrayOutputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.sql.SQLException; 
import java.util.ArrayList; 

import com.itextpdf.text.Chunk; 
import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.List; 
import com.itextpdf.text.ListItem; 
import com.itextpdf.text.Paragraph; 
import com.itextpdf.text.pdf.PRStream; 
import com.itextpdf.text.pdf.PdfAnnotation; 
import com.itextpdf.text.pdf.PdfArray; 
import com.itextpdf.text.pdf.PdfDictionary; 
import com.itextpdf.text.pdf.PdfName; 
import com.itextpdf.text.pdf.PdfReader; 
import com.itextpdf.text.pdf.PdfWriter; 


/** 
* Creates a PDF listing of attachments 
* The attachments can be extracted. 
*/ 
public class AttachFiles { 

    /** Path to the resources. */ 
    public static final String RESOURCE = "chapter16/%s.pdf"; 
    /** The filename of the resulting PDF. */ 
    public static final String FILENAME = "ResultingFile.pdf"; 
    /** The path to the resulting PDFs */ 
    public static final String PATH = "chapter16/%s"; 
    /** The filename of the PDF */ 
    public static final String RESULT = String.format(PATH, FILENAME); 

    /** 
    * Creates a PDF listing 
    * @throws IOException 
    * @throws DocumentException 
    * @throws SQLException 
    */ 
    public static void main(String[] args) throws IOException, DocumentException, SQLException { 
     AttachFiles attachFiles = new AttachFiles(); 
     FileOutputStream os = new FileOutputStream(RESULT); 
     os.write(attachFiles.createPdf()); 
     os.flush(); 
     os.close(); 
     attachFiles.extractAttachments(RESULT); 
    } 

    /** 
    * Extracts attachments from an existing PDF. 
    * @param src the path to the existing PDF 
    * @param dest where to put the extracted attachments 
    * @throws IOException 
    */ 
    public void extractAttachments(String src) throws IOException { 
     PdfReader reader = new PdfReader(src); 
     PdfArray array; 
     PdfDictionary annot; 
     PdfDictionary fs; 
     PdfDictionary refs; 
     for (int i = 1; i <= reader.getNumberOfPages(); i++) { 
      array = reader.getPageN(i).getAsArray(PdfName.ANNOTS); 
      if (array == null) continue; 
      for (int j = 0; j < array.size(); j++) { 
       annot = array.getAsDict(j); 
       if (PdfName.FILEATTACHMENT.equals(annot.getAsName(PdfName.SUBTYPE))) { 
        fs = annot.getAsDict(PdfName.FS); 
        refs = fs.getAsDict(PdfName.EF); 
        for (PdfName name : refs.getKeys()) { 
         FileOutputStream fos 
          = new FileOutputStream(String.format(PATH, fs.getAsString(name).toString())); 
         fos.write(PdfReader.getStreamBytes((PRStream)refs.getAsStream(name))); 
         fos.flush(); 
         fos.close(); 
        } 
       } 
      } 
     } 
    } 

    /** 
    * Creates the PDF. 
    * @return the bytes of a PDF file. 
    * @throws DocumentExcetpion 
    * @throws IOException 
    * @throws SQLException 
    */ 
    public byte[] createPdf() throws DocumentException, IOException, SQLException { 
     // step 1 
     Document document = new Document(); 
     // step 2 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     PdfWriter writer = PdfWriter.getInstance(document, baos); 
     // step 3 
     document.open(); 
     // step 4 
     document.add(new Paragraph("This is a list pdf attachments.")); 
     PdfAnnotation annot; 
     ListItem item; 
     Chunk chunk; 
     List list = new List(); 
     // I create the list which has the list of files names i want to attach 
     ArrayList<String> strList = new ArrayList<String>(); 
     strList.add("Strings"); // its the same file I'm attaching four times 
     strList.add("Strings"); 
     strList.add("Strings"); 
     strList.add("Strings"); 

     for (String strWord : strList) { 
      annot = PdfAnnotation.createFileAttachment(
        writer, null, "Name", null, 
        String.format(RESOURCE, strWord), String.format("%s.pdf", strWord)); 
      item = new ListItem("Name"); 
      item.add("\u00a0\u00a0"); 
      chunk = new Chunk("\u00a0\u00a0\u00a0\u00a0"); 
      chunk.setAnnotation(annot); 
      item.add(chunk); 
      list.add(item); 
     } 
     document.add(list); 
     // step 5 
     document.close(); 
     return baos.toByteArray(); 
    } 
}