2

メインページの添付ファイルへのリンクを含む既存の PDF にファイルを添付するにはどうすればよいですか?

私は Itext を使用していますが、これまでのところドキュメント レベルでのみ添付できました。

4

1 に答える 1

4

以下のコードを使用して添付ファイルを作成します。数分しか費やしていないので、コードを投げて理解して不要なコードを削除してください。

添付するすべての pdf またはファイルを指す RESOURCE 変数があります。この場合は 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();
    }
}
于 2012-08-14T09:11:54.017 に答える