使用ImageMagick C ++ API读取PDF页面数量而不读取所有图像

时间:2015-05-06 12:22:52

标签: c++ pdf imagemagick

我需要相当便宜地阅读PDF的页面大小,因此我的用户可以选择特定的页面(并以更高的细节加载它们)。

我认为使用Magick ++ API执行此操作的唯一方法是使用STL调用readImages。这确实加载了PDF的所有页面Magick::Images,并且对于大型PDF文档来说非常昂贵(50页的订单在我的机器上大约需要15秒。)

我在ImageMagick的论坛上阅读了a post,该论坛讲的是ReadOptions类(在撰写本文时未记录),您可以传递给readImages方法来读取较低密度的图像,但是这个还需要太长时间。 (大约10s)。 ReadOptions上的其他任何选项都没有真正对速度产生重大影响。

这是我目前的代码:

    std::vector<Magick::Image> PDFImageList;
    Magick::ReadOptions readOptions;
    readOptions.density(Magick::Geometry(2,2));
    readOptions.size(Magick::Geometry(1,1));
    readOptions.depth(8);
    // This call takes too long.
    Magick::readImages(&PDFImageList, m_pathToPDFFile, readOptions);
    int numberOfPages = PDFImageList.size();

我也尝试了Magick::Image.ping()方法,但找不到与页码相关的任何数据。

任何其他属性或无证件的ImageMagick ++功能,我可以尝试以便宜的方式获取页数吗?

1 个答案:

答案 0 :(得分:0)

使用另一个问题的answer和Qt的流程类,程序现在在命令行上运行以下命令:

gs -q -dNODISPLAY -c "(input.pdf) (r) file runpdfbegin pdfpagecount = quit" 

返回页码作为标准输出的最后一行。由于gs可执行文件是ImageMagick的PDF阅读功能的要求,我很满意这个解决方案。它也很快。 (约50页PDF不到一秒)