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 时遇到同样的问题,而不包括 整个额外的库 一个function(PoDoFo,不稳定,可以做这个,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 图像时都会这样做。
如果您愿意为一个函数包含 整个库,poppler 和 PoDoFo可以做到这一点。
显然这在 1000 亿页的 PDF 上会失败。
我正在努力编写一个函数来从 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 时遇到同样的问题,而不包括 整个额外的库 一个function(PoDoFo,不稳定,可以做这个,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 图像时都会这样做。
如果您愿意为一个函数包含 整个库,poppler 和 PoDoFo可以做到这一点。
显然这在 1000 亿页的 PDF 上会失败。