项目中需要将pdf文件转成图片,搜索了一下发现poppler这个库做这个事情比较合适。本来想偷个懒,直接用别人编译好的windows版poppler库
http://blog.alivate.com.au/poppler-windows/
参照poppler自带的例子cpp/tests/poppler-render.cpp,写了一个pdf转换成图片的简单测试程序。但在VC2015中链接这些编译好的动态库,总是报错无法解析的外部符号。这是因为对于C++,VC和gcc的abi并不一致,对于某个类的成员,gcc和vc生成的符号名称不一致,所以在相互调用的时候会出现找不到符号。但是对于c函数,vc和gcc的abi是兼容的,因此像ffmpeg库这些就可以在mingw中编译,vc中使用。
没有办法,只能自己尝试编译poppler windows版了。首先到 https://poppler.freedesktop.org/ 下载最新的源码包,解压缩。参照poppler的说明,编译步骤
cd poppler-0.68.0
mkdir build
cd build
cmake ..
但是在cmake这一步运行不通过,提示缺少freetype库。在windows下面安装各种开发库,最方便是使用vcpkg了,
.\vcpkg.exe install freetype
同样,编译poppler还需要jpeg、png、tiff、openjpeg、libiconv等其他库。
.\vcpkg.exe install devil
.\vcpkg.exe install openjpeg
.\vcpkg.exe install libiconv
回到poppler-0.68.0/build目录,删除所有文件,重新执行cmake,并且要让cmake使用vcpkg安装的库
cmake -DCMAKE_TOOLCHAIN_FILE=E:\vcpkg-master\scripts\buildsystems\vcpkg.cmake ..
这样,终于可以生成vc的工程文件poppler.sln了。打开工程,编译poppler-cpp一项就够了。
另外,测试的时候发现,打开带中文名字的pdf文件有可能会有问题。这是因为poppler的windows实现中,打开文件经过了一次文件名从utf8到utf16的转码。
// try to open file
#ifdef _WIN32
wchar_t *wFileName = (wchar_t*)utf8ToUtf16(fileName->getCString());
file = GooFile::open(wFileName);
gfree(wFileName);
#else
因此,这就要求我们输入文件名也是使用utf8编码的。如果是windows默认的GB2312编码,就会转码失败导致pdf文件无法打开
网友评论