添加到pdf文件的附件及其链接

时间:2012-08-14 08:09:40

标签: java pdf itext

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

我正在使用Itext,到目前为止只设法附加在文档级别。

1 个答案:

答案 0 :(得分:4)

使用以下代码创建附件, 请抛出代码,因为我只花了几分钟,明白了 它并删除不必要的代码。

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

chapter16文件夹中包含您要附加​​的pdf 和%s将替换为您提供的文件的名称和 文件格式为.pdf(如果附加pdf文件)

它在我的系统中工作和测试。我从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();
    }
}