使用 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
我可以使用 Python 访问 ImageMagick API 吗?
ImageMagick/Imagick 使用原生 PHP API 将 PDF 转换为 JPG