Michael A
Michael A

Reputation: 5850

Adding attachment to pdf file with a link to it

How can i attach a file to existing pdf including a link to the attachment on the main page?

I am using Itext and so far managed to attach on the document level only.

Upvotes: 2

Views: 4845

Answers (1)

likeToCode
likeToCode

Reputation: 852

Use the below code to create an attachments, please go throw the code as I have spent only few minutes, understand it and remove the unnecessary codes.

There is a RESOURCE variable which points all the pdf's or files you want to attach. here in this case, it is public static final String RESOURCE = "chapter16/%s.pdf";

Where the chapter16 folder has the pdf's you want to attached and %s will be replaced with the name of the file that you provide and the file format is .pdf(if you are attaching a pdf file)

It works and tested in my system. I refered this code from 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();
    }
}

Upvotes: 4

Related Questions