Я пытаюсь извлечь изображения из файла PDF с помощью PDFsharp. Тестовый файл, на котором я запускал код, показывает тип фильтра / JBIG2. Я хотел бы помочь в понимании того, как декодировать это изображение и сохранить его, если это вообще возможно с помощью PDFSharp.
Код, который я использую для извлечения и последующего сохранения изображения, выглядит следующим образом:
const string filename = "../../../test.pdf";
PdfDocument document = PdfReader.Open(filename);
int imageCount = 0;
foreach (PdfPage page in document.Pages) { // Iterate pages
// Get resources dictionary
PdfDictionary resources = page.Elements.GetDictionary("/Resources");
if (resources != null) {
// Get external objects dictionary
PdfDictionary xObjects = resources.Elements.GetDictionary("/XObject");
if (xObjects != null) {
ICollection<PdfItem> items = xObjects.Elements.Values;
foreach (PdfItem item in items) { // Iterate references to external objects
PdfReference reference = item as PdfReference;
if (reference != null) {
PdfDictionary xObject = reference.Value as PdfDictionary;
// Is external object an image?
if (xObject != null && xObject.Elements.GetString("/Subtype") == "/Image") {
ExportImage(xObject, ref imageCount);
}
}
}
}
}
}
static void ExportImage(PdfDictionary image, ref int count) {
string filter = image.Elements.GetName("/Filter");
switch (filter) {
case "/DCTDecode":
ExportJpegImage(image, ref count);
break;
case "/FlateDecode":
ExportAsPngImage(image, ref count);
break;
}
}
static void ExportJpegImage(PdfDictionary image, ref int count) {
// Fortunately, JPEG has native support in PDF and exporting an image is just writing the stream to a file.
byte[] stream = image.Stream.Value;
FileStream fs = new FileStream(
String.Format("Image{0}.jpeg", count++), FileMode.Create, FileAccess.Write
);
BinaryWriter bw = new BinaryWriter(fs);
bw.Write(stream);
bw.Close();
}
Выше я получаю тип фильтра как /JBIG2
, для которого у меня есть поддержка. Приведенный выше код используется из PDFSharp: образец экспорта изображений