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

Posted

技术标签:

【中文标题】使用 ImageMagick C++ API 读取 PDF 中的页面数量,而不读取所有图像【英文标题】:Read amount of pages in PDF using ImageMagick C++ API without reading all images 【发布时间】:2015-05-06 12:22:51 【问题描述】:

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

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

我确实在 ImageMagick 的论坛上阅读了 a post,其中谈到了 ReadOptions 类(在撰写本文时未记录),您可以传递给 readImages 方法来读取较低密度的图像,但这仍然需要很长时间。 (大约 10 秒)。 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++ 功能?

【问题讨论】:

不确定这是否有帮助或更快,因此只是评论。在命令行上试试这个,看看它是否有帮助,如果你能适应 C++...identify -format "%s\n" file.pdf 有一个 Magick::Image.png 选项,但对于 PDF 来说,这将花费大约相同的时间。我一半记得 ImageMagick 将 PDF 格式委托给another library。直接使用该 API 可能会更快。 @MarkSetchell 命令行似乎确实有效,但似乎同样慢。此外,我不想将 ImageMagick 安装添加为对用户 PC 的依赖。 @emcconville,我确实尝试了 ping 方法,但该调用中没有任何内容包含有关 PDF 文件中总页数的信息。我将尝试查看 GhostScript 依赖项,看看它能让我走多远。 可能是 CPDF...community.coherentpdf.com...cpdf -pages yourFile.pdf 【参考方案1】:

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

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

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

【讨论】:

以上是关于使用 ImageMagick C++ API 读取 PDF 中的页面数量,而不读取所有图像的主要内容,如果未能解决你的问题,请参考以下文章

在CentOS上为PHP安装Imagick和ImageMagick

Imagemagick 无法读取文件(MAMP)

我可以使用 Python 访问 ImageMagick API 吗?

ImageMagick/Imagick 使用原生 PHP API 将 PDF 转换为 JPG

读取Python中imagemagick子进程的输出[复制]

Matlab API 从 C++ 读取 .mat 文件,使用 STL 容器