Извлечение изображения из PDF с использованием PDFSharp с фильтром / JBIG2 - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь извлечь изображения из файла 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: образец экспорта изображений

1 Ответ

0 голосов
/ 30 марта 2019

JBIG2 наиболее широко используется в PDF, однако за пределами PDF это другая история.Хотя .jbig2 - это формат растровых изображений, его поддержка довольно скудна с точки зрения средств просмотра изображений.Лучше всего будет экспортировать его в формате TIFF со сжатием CCITT4, как это делает Acrobat.

...