Извлечение изображений с podofo из страниц PDF

Мне нужно извлечь все изображения из PDF-файла с podofo. Извлечение всех изображений из файла работает хорошо. Я использовал пример экстрактора изображений для этого. Это получает все объекты и перебирает их. Но мне нужно перебирать страницы и проверять объекты изображений на странице. Кто-нибудь знает как это сделать?

1 ответ

Решение

Отрываясь от podofoimgextract, вы можете перебирать каждую страницу, получать объект ресурса страницы, проверять XObject или Image, и отсюда это почти тот же самый код, который используется в утилите извлечения изображений.

for (int pageN = 0; pageN < document.GetPageCount(); pageN++) {
  PdfPage* page = document.GetPage(pageN);
  PdfDictionary resource = page->GetResources()->GetDictionary();

  for (auto& k : resource.GetKeys()) {
    if (k.first.GetName() == "XObject" || k.first.GetName() == "Image") {
      if (k.second->IsDictionary()) {
        auto targetDict = k.second->GetDictionary();
        for (auto& r : k.second->GetDictionary().GetKeys()) {
          // The XObject will usually contain indirect objects as it's values.
          // Check for a reference
          if (r.second->IsReference()) {
            // Get the object that is being referenced.
            auto target =
              document.GetObjects().GetObject(r.second->GetReference());
            if (target->IsDictionary()) {
              auto targetDict = target->GetDictionary();
              auto kf = targetDict.GetKey(PdfName::KeyFilter);
              if (!kf)
                continue;
              if (kf->IsArray() && kf->GetArray().GetSize() == 1 &&
                  kf->GetArray()[0].IsName() &&
                  kf->GetArray()[0].GetName().GetName() == "DCTDecode") {
                kf = &kf->GetArray()[0];
              }
              if (kf->IsName() && kf->GetName().GetName() == "DCTDecode") {
                ExtractImage(target, true);
              } else {
                ExtractImage(target, false);
              }
            }
          }
        }
      }
    }
  }
}
Другие вопросы по тегам