使用pdf页面中的podofo提取图像

时间:2017-03-30 21:06:21

标签: c++ pdf podofo

我需要使用podofo从pdf文件中提取所有图像。从文件中提取所有图像效果很好。我使用了图像提取器示例。这将接收所有对象并对其进行迭代。但我需要迭代页面并检查页面上的图像对象。有谁知道怎么做?

1 个答案:

答案 0 :(得分:0)

小猪退出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);
              }
            }
          }
        }
      }
    }
  }
}