Magick++ API:获取 PDF 页数?

Magick++ API: Get PDF page count?

我正在努力编写一个函数来从 PDF 中获取页数,而无需为此目的使用 external/additional(即非 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]指请求的页面)

它转储这样的错误:

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——但我不知道如何从除非让它像这样崩溃?

有办法吗?

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

如果您使用的是 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;

我能想到的最好的办法,如果有人在使用 ImageMagick/GraphicsMagick 时遇到同样的问题,而不包括 整个额外的库 一个functionPoDoFo,不稳定,可以做这个,poppler也可以做)就是用这个based关于题中写的代码:

#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 '}

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

它很简陋,感觉像是一个 hack,但它比 快多了(我的意思是几乎无限快)尝试使用 ping() 或 readImages() 加载 list/vector/array 并计算列表的大小。

令人沮丧的是,Magick++ 没有提供可访问的方法来检索 PDF 的页数,但显然 不仅能够 获取页数,而且 每次 ping 图像时都会这样做

如果您愿意为一个函数包含 整个库popplerPoDoFo可以做到这一点。

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