magick++ API:获取PDF页数?



我正在努力编写一个函数来从PDF中获取页面数量,而不使用外部/额外的(即,除了magick++)库用于此目的-然而,当我执行这样的东西时:

#include <Magick++.h> 
using namespace Magick; 
int main(int argc,char **argv) 
{ 
InitializeMagick(*argv);
Image master; 
master.ping("a-66-page-pdf.pdf[999999]");
return 0;
} 

(其中[999999]指所请求的页面)

dump如下错误:

Requested FirstPage is greater than the number of pages in the file: 66
No pages will be processed (FirstPage > LastPage).
terminate called after throwing an instance of 'Magick::ErrorDelegate'
what():  Magick: Postscript delegate failed (a-66-page-pdf.pdf) reported by coders/pdf.c:434 (ReadPDFImage)
Magick: abort due to signal 6 (SIGABRT) "Abort"...
Aborted (core dumped)

ie,它知道pdf有66——但我不知道如何从它那里获得这些信息,除了让它像这样崩溃吗?

有办法吗?

如果使用ImageMagick-7,请使用STL方法。

std::list<Magick::Image> master;
Magick::pingImages(&master, "a-66-page-pdf.pdf");
std::cout << master.size() << std::endl;

pingImages方法在ImageMagick-6中不可用,因此您需要读取所有图像。

Magick::ReadOptions opts;
// Set dpi & depth, if needed
// opts.depth(8);
// opts.density(72);
std::list<Magick::Image> master;
Magick::readImages(&master, "a-66-page-pdf.pdf", opts);
std::cout << master.size() << std::endl;

您可以尝试初始化计数器并创建该字符串,并将counter作为索引。只要使用try-catch块中的代码在while循环中增加计数器,当上述异常被抛出时,计数器将指示页面数。

我能想出的最好的,如果有人面临同样的问题与ImageMagick/GraphicsMagick工作,不包括整个额外的库为这个一个函数(PoDoFo)poppler也可以这样做)是使用这个基于问题所写的代码:

#include <Magick++.h> 
#include <cstring>
using namespace Magick; 
int main(int argc,char **argv) 
{
if (argc < 2) {
return 1;
}
InitializeMagick(*argv);

try {
Image master;

char cmd[4096] = {""};
strcat(cmd, argv[1]);
strcat(cmd, "[99999999999]");
master.ping(cmd);

} catch( Exception &error_ )
{
// do nothing

}
return 0;
} 

然后这样命名:

./compiled-program any-given-pdf.pdf 2>/dev/null | grep file: | awk {'print $13'}

可能与popen()等。也许你可以重定向stdout到一个字符串,我还没有尝试过。

它是janky,感觉像一个hack,但它是一个他妈的快得多(我的意思是几乎无限快)比尝试用ping()或readImages()加载列表/向量/数组并计算列表的大小。

magick++没有提供可访问的方法来检索PDF的页数,这是无止境的令人沮丧的,然而显然不仅仅是有能力获取页面计数,但是做到了

如果你同意包含整个库对于一个函数,popplerPoDoFo可以做到这一点。

显然,这在1000亿页的PDF上是失败的。

最新更新