Это старый вопрос, тем не менее, я думаю, что мое альтернативное решение (с использованием PDF Clown ) может представлять некоторый интерес, так как это намного чище (и более полно, поскольку он повторяется как на уровне документа, так и на уровне страницы) , чем ранее предложенные фрагменты кода:
using org.pdfclown.bytes;
using org.pdfclown.documents;
using org.pdfclown.documents.files;
using org.pdfclown.documents.interaction.annotations;
using org.pdfclown.objects;
using System;
using System.Collections.Generic;
void ExtractAttachments(string pdfPath)
{
Dictionary<string, byte[]> attachments = new Dictionary<string, byte[]>();
using(org.pdfclown.files.File file = new org.pdfclown.files.File(pdfPath))
{
Document document = file.Document;
// 1. Embedded files (document level).
foreach(KeyValuePair<PdfString,FileSpecification> entry in document.Names.EmbeddedFiles)
{EvaluateDataFile(attachments, entry.Value);}
// 2. File attachments (page level).
foreach(Page page in document.Pages)
{
foreach(Annotation annotation in page.Annotations)
{
if(annotation is FileAttachment)
{EvaluateDataFile(attachments, ((FileAttachment)annotation).DataFile);}
}
}
}
}
void EvaluateDataFile(Dictionary<string, byte[]> attachments, FileSpecification dataFile)
{
if(dataFile is FullFileSpecification)
{
EmbeddedFile embeddedFile = ((FullFileSpecification)dataFile).EmbeddedFile;
if(embeddedFile != null)
{attachments[dataFile.Path] = embeddedFile.Data.ToByteArray();}
}
}
Обратите внимание, что вам не нужно беспокоиться об исключениях нулевого указателя , поскольку PDF Clown обеспечивает всю необходимую абстракцию и автоматизацию для обеспечения плавного обхода модели.
PDF Clown - это библиотека LGPL 3, реализованная как на платформах Java, так и на платформе .NET (я являюсь ее ведущим разработчиком): если вы хотите попробовать, я предлагаю вам проверить ее репозиторий SVN на sourceforge.net как он продолжает развиваться.