如何使用iTextsharp将文件插入现有PDF文件夹的文件夹中

时间:2012-10-23 09:12:55

标签: c# pdf itextsharp

使用How to merge PDFs into a PDF Portfolio?中的答案,我已经能够使用iTextSharp创建PDF文件夹。但是,使用Adobe Acrobat我可以创建文件夹,并且我可以将文件放在这些文件夹中。

如何创建文件夹以及如何使用iTextSharp将文件放入PDF文件夹中的这些文件夹?

我尝试使用pdf检查程序来查看包含和不包含文件夹的投资组合之间的差异,但我无法看到任何文件夹。我想我正在寻找错误的地方

修改

对于我的这个特定用例,实际上可以预先创建包含文件夹的PDF文件夹。因此,能够在现有PDF文件夹中的文件夹中插入文件,而不是实际创建文件夹本身更为重要。

2 个答案:

答案 0 :(得分:3)

以下是概念代码的一些证明,该代码创建了包含几个文件夹的新组合pdf,并将现有的pdf文件插入到每个文件夹中。这种方法基于使用文本编辑器查看使用原始帖子中链接的示例代码创建的pdf文件,然后使用Acrobat创建文件夹并将嵌入文件移动到该文件夹​​中,保存pdf,然后查看使用文本编辑器进行更改。在代码中,我正在重新创建在比较组合pdf的两个版本时发现的更改,因此当它工作时(至少在我的机器上),它可能不是完成任务的最佳方式。

如果您想像我一样查看之前/之后的文件,请使用iTextsharp创建投资组合,然后使用Acrobat打开并创建文件夹并将嵌入的文件移动到文件夹中,然后再使用文件再次保存文件工具栏上的保存图标。不要使用文件 - >另存为...选项将文件另存为投资组合PDF。 Acrobat重新组织文件并压缩或以其他方式将大量文件转换为您无法在文本编辑器中读取的二进制数据。我发现删除二进制流数据使得结构更容易遵循。只需删除每对stream / endstream个关键字之间的所有内容。

Acrobat在作品集pdf中做的一件事是嵌入一个Flash文件,该文件为投资组合提供动画和更具吸引力的主题。我无法弄清楚如何做到这一点,因此这段代码生成的文件看起来很简单。

using System;
using System.IO;
using System.Linq;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.collection;

public class FolderWriter {
    private const string Folder = @"C:\Path\to\your\pdf\files";
    private const string File1 = @"Pdf File 1.pdf";
    private const string File2 = @"Pdf File 2.pdf";
    private readonly string file1Path = Path.Combine(Folder, File1);
    private readonly string file2Path = Path.Combine(Folder, File2);
    private readonly string[] keys = new[] {
        "Type",
        "File"
    };

    public void Write(Stream stream) {
        using (Document document = new Document()) {
            PdfWriter writer = PdfWriter.GetInstance(document, stream);

            document.Open();
            document.Add(new Paragraph("This document contains a collection of PDFs"));

            PdfIndirectReference parentFolderObjectReference = writer.PdfIndirectReference;
            PdfIndirectReference childFolder1ObjectReference = writer.PdfIndirectReference;
            PdfIndirectReference childFolder2ObjectReference = writer.PdfIndirectReference;

            PdfDictionary parentFolderObject = GetFolderDictionary(0);
            parentFolderObject.Put(new PdfName("Child"), childFolder1ObjectReference);
            parentFolderObject.Put(PdfName.NAME, new PdfString());

            PdfDictionary childFolder1Object = GetFolderDictionary(1);
            childFolder1Object.Put(PdfName.NAME, new PdfString("Folder 1"));
            childFolder1Object.Put(PdfName.PARENT, parentFolderObjectReference);
            childFolder1Object.Put(PdfName.NEXT, childFolder2ObjectReference);

            PdfDictionary childFolder2Object = GetFolderDictionary(2);
            childFolder2Object.Put(PdfName.NAME, new PdfString("Folder 2"));
            childFolder2Object.Put(PdfName.PARENT, parentFolderObjectReference);

            PdfCollection collection = new PdfCollection(PdfCollection.DETAILS);
            PdfCollectionSchema schema = CollectionSchema();
            collection.Schema = schema;
            collection.Sort = new PdfCollectionSort(keys);
            collection.Put(new PdfName("Folders"), parentFolderObjectReference);
            writer.Collection = collection;

            PdfFileSpecification fs;
            PdfCollectionItem item;

            fs = PdfFileSpecification.FileEmbedded(writer, file1Path, File1, null);
            item = new PdfCollectionItem(schema);
            item.AddItem("Type", "pdf");
            fs.AddCollectionItem(item);
            // the description is apparently used to place the 
            // file in a particular folder.  The number between the < and >
            // is used to put the file in the folder that has the matching id
            fs.AddDescription(GetDescription(1, File1), false);
            writer.AddFileAttachment(fs);

            fs = PdfFileSpecification.FileEmbedded(writer, file2Path, File2, null);
            item = new PdfCollectionItem(schema);
            item.AddItem("Type", "pdf");
            fs.AddCollectionItem(item);
            fs.AddDescription(GetDescription(2, File2), false);
            writer.AddFileAttachment(fs);

            writer.AddToBody(parentFolderObject, parentFolderObjectReference);
            writer.AddToBody(childFolder1Object, childFolder1ObjectReference);
            writer.AddToBody(childFolder2Object, childFolder2ObjectReference);

            document.Close();
        }
    }

    private static string GetDescription(int id, string fileName) {
        return string.Format("<{0}>{1}", id, fileName);
    }

    private static PdfDictionary GetFolderDictionary(int id) {
        PdfDictionary dic = new PdfDictionary(new PdfName("Folder"));
        dic.Put(PdfName.CREATIONDATE, new PdfDate(DateTime.Now));
        dic.Put(PdfName.MODDATE, new PdfDate(DateTime.Now));
        dic.Put(PdfName.ID, new PdfNumber(id));
        return dic;
    }

    private static PdfCollectionSchema CollectionSchema() {
        PdfCollectionSchema schema = new PdfCollectionSchema();
        PdfCollectionField type = new PdfCollectionField("File type", PdfCollectionField.TEXT);
        type.Order = 0;
        schema.AddField("Type", type);
        PdfCollectionField filename = new PdfCollectionField("File", PdfCollectionField.FILENAME);
        filename.Order = 1;
        schema.AddField("File", filename);
        return schema;
    }
}

答案 1 :(得分:1)