C# 如何使用iTextSharp阅读PDF公文包

C# 如何使用iTextSharp阅读PDF公文包,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我正在使用iTextSharp,它是一款C#应用程序,可以读取PDF文件并将页面分成单独的PDF文档。它运行良好,但投资组合除外。现在,我正试图找出如何读取包含两个嵌入PDF文档的PDF文件包(或集合,在iText中似乎是这样称呼的)。我只想打开公文包,枚举嵌入的文件,然后将它们保存为单独的简单PDF文件 这里有一个关于如何通过编程创建PDF公文包的好例子: 但我没有看到任何阅读投资组合的例子。任何帮助都将不胜感激 您引用的示例将嵌入的文件添加为文档级附件。因此,您可以按如下方式提取文件: P

我正在使用iTextSharp,它是一款C#应用程序,可以读取PDF文件并将页面分成单独的PDF文档。它运行良好,但投资组合除外。现在,我正试图找出如何读取包含两个嵌入PDF文档的PDF文件包(或集合,在iText中似乎是这样称呼的)。我只想打开公文包,枚举嵌入的文件,然后将它们保存为单独的简单PDF文件

这里有一个关于如何通过编程创建PDF公文包的好例子:


但我没有看到任何阅读投资组合的例子。任何帮助都将不胜感激

您引用的示例将嵌入的文件添加为文档级附件。因此,您可以按如下方式提取文件:

PdfReader reader = new PdfReader(readerPath);
PdfDictionary root = reader.Catalog;
PdfDictionary documentnames = root.GetAsDict(PdfName.NAMES);
PdfDictionary embeddedfiles = 
    documentnames.GetAsDict(PdfName.EMBEDDEDFILES);
PdfArray filespecs = embeddedfiles.GetAsArray(PdfName.NAMES);
for (int i = 0; i < filespecs.Size; ) {
  filespecs.GetAsString(i++);
  PdfDictionary filespec = filespecs.GetAsDict(i++);
  PdfDictionary refs = filespec.GetAsDict(PdfName.EF);
  foreach (PdfName key in refs.Keys) {
    PRStream stream = (PRStream) PdfReader.GetPdfObject(
      refs.GetAsIndirectObject(key)
    );

    using (FileStream fs = new FileStream(
      filespec.GetAsString(key).ToString(), FileMode.OpenOrCreate
    )){
      byte[] attachment = PdfReader.GetStreamBytes(stream);
      fs.Write(attachment, 0, attachment.Length);
    }
  }
} 
PdfReader reader=新的PdfReader(readerPath);
PdfDictionary root=reader.Catalog;
PdfDictionary documentnames=root.GetAsDict(PdfName.NAMES);
PdfDictionary嵌入文件=
documentnames.GetAsDict(PdfName.EMBEDDEDFILES);
PdfArray filespecs=embeddedfiles.GetAsArray(PdfName.NAMES);
对于(int i=0;i
如果要测试此功能,请将Kubrick集合示例中的输出文件传递给
PdfReader
构造函数(
readerPath

  • Java版本:

希望本月我能有时间从5.2.0.0版(iTextSharp版本现在比Java版本落后大约三周)更新C#示例。

你是最棒的!这很好用,非常感谢。我觉得这和目录下的字典有关,但我不可能弄清楚所有的细节。将其添加到在线C#示例中会很好。上面的代码有一行“byte[]attachment=PdfReader.GetStreamBytes(stream);”,它将附件内容加载到字节数组中。如果附件是PDF文件,我可以打开附件的PdfReader作为“PdfReader reader=new PdfReader(附件)”。这样做的一个问题是,我们将整个附件文件加载到内存中(字节数组)。是否可以在不将整个附件文件加载到内存的情况下访问附件的PdfReader?