Qt之显示PDF文件

之前使用过mupdf库,能够成功显示pdf,但是我用着有BUG,不太理解它的代码,搞了好久都不行。后面又试了其他库,如pdfium、popler、下载了很多例程,都跑不起来!后面偶然得知xpdf库,看起来应该容易编译,因此这里主要是针对xpdf库的编译。

目前状态:革命尚未成功,我辈还需努力。。。但大家可以参考,不过小心不要被我带到沟里哈哈!

一、官网

Download Xpdf and XpdfReader

官网有大致的介绍,以及最新版本的xpdf源码的下载链接。但是没有具体讲怎么移植xpdf。

二、准备windows下的编译环境

我的编译环境

win10操作系统

vs2015社区版

qt版本:qt5.9.5

Qt之显示PDF文件_第1张图片

在官网下载工具链。如下图红色框中所示,点击后即可下载。这个压缩包是linux下的格式,解压需要费点功夫。

Qt之显示PDF文件_第2张图片

下载并解压后放在xpdf源码目录下,如下图所示。

Qt之显示PDF文件_第3张图片

三、编译freetype

在如下图的路径,双击使用VS打开freetype.sln(我的VS是vs2015社区版),选择Release和win32后,点击运行进行编译,编程出dll文件。(由于dll不能直接运行,因此会报如下的错误,忽略即可)。

编译完成在 如下的路径下即可看到dll和lib文件。

工程路径:\freetype-2.12.0\builds\windows\vc2010

编译结构路径:\freetype-2.12.0\objs

Qt之显示PDF文件_第4张图片

Qt之显示PDF文件_第5张图片

Qt之显示PDF文件_第6张图片

在xpdf源码目录新建文件夹freetype,将刚才生成的lib和dll文件拷贝到该文件夹中,就完成了freetype的编译。

Qt之显示PDF文件_第7张图片

四、编译lcms

在如下图路径打开lcms的工程,右键点击lcms2_DLL将其设为启动项目,选择Release和win32后,点击运行进行编译,编程出dll文件。

工程路径:\lcms2-2.12\Projects\VC2015

编译结构路径:\lcms2-2.12\bin

Qt之显示PDF文件_第8张图片

Qt之显示PDF文件_第9张图片

Qt之显示PDF文件_第10张图片

在xpdf源码目录新建文件夹lcms,将刚才生成的lib和dll文件拷贝到该文件夹中,就完成了lcms的编译。

Qt之显示PDF文件_第11张图片

五、编译zlib

zlib-1.2.12版本有点bug,需要先处理一下。

1、拷贝zlib-1.2.11(去网上下载一个)中的masmx76到contrib目录下;

2、修改代码

 (1)修改函数uLong ZEXPORT crc32_combine(crc1, crc2, len2)
    z_off_t len2改为z_off64_t len2;

Qt之显示PDF文件_第12张图片

(2)修改函数:uLong ZEXPORT crc32_combine_gen(len2)
    z_off_t len2改为z_off64_t len2

Qt之显示PDF文件_第13张图片

(3)修改函数:uLong crc32_combine_op(crc1, crc2, op)

改为uLong ZEXPORT  crc32_combine_op(crc1, crc2, op)

Qt之显示PDF文件_第14张图片

3、右键zlibvc,设置 SAFESEH 映像是不安全的异常处理程序关闭

Qt之显示PDF文件_第15张图片

完成 后开始正式的编译。

在如下图路径打开zlib的工程,选择Release和win32后,点击运行进行编译,编程出dll文件。

工程路径:\zlib-1.2.12\contrib\vstudio\vc14

编译结构路径:\zlib-1.2.12\contrib\vstudio\vc14\x86\ZlibDllRelease

Qt之显示PDF文件_第16张图片

Qt之显示PDF文件_第17张图片

Qt之显示PDF文件_第18张图片

在xpdf源码目录新建文件夹zlib,将刚才生成的lib和dll文件拷贝到该文件夹中,就完成了zlib的编译。

Qt之显示PDF文件_第19张图片

如果出现异常情况:

问题1.没有bld_ml32.bat

编译器报错详情:

Qt之显示PDF文件_第20张图片

问题解决:查看contrib目录下,确实没有masmx86,拷贝zlib-1.2.11中的masmx86和masmx64到contrib目录下,问题解决。

问题2.实参的字节长度不同于以前的调用或引用

编译器报错详情如下:

Qt之显示PDF文件_第21张图片

问题解决:在crc32.c中修改如下内容

1.修改函数uLong ZEXPORT crc32_combine(crc1, crc2, len2)
    uLong crc1;
    uLong crc2;
    z_off_t len2;为z_off64_t len2;

Qt之显示PDF文件_第22张图片

2.修改函数:1.uLong ZEXPORT crc32_combine_gen(len2)
    z_off_t len2;为z_off64_t len2

Qt之显示PDF文件_第23张图片

3.修改:

uLong crc32_combine_op(crc1, crc2, op)为

uLong ZEXPORT  crc32_combine_op(crc1, crc2, op)

Qt之显示PDF文件_第24张图片

问题3:模块对于 SAFESEH 映像是不安全的。

使用Release编译,忽略其他编译警告,编译通过。
 

六、编译libpng

libpng的编译以来zlib,因此需要将zlib的源码放在libpng源码的同级目录(前面已经放过了)

打开zlib.props文件,修改zlib的路径和版本(放在同级目录就不需要修改路径,修改版本就行)

Qt之显示PDF文件_第25张图片

在如下图路径打开libpng的工程,右键点击libpng将其设为启动项目,选择Release和win32后,点击运行进行编译,编程出dll文件。

工程路径:\libpng-1.6.35\projects\vstudio

编译结构路径:\libpng-1.6.35\projects\vstudio\Release

Qt之显示PDF文件_第26张图片

Qt之显示PDF文件_第27张图片

Qt之显示PDF文件_第28张图片

在xpdf源码目录新建文件夹libpng,将刚才生成的lib和dll文件拷贝到该文件夹中,就完成了libpng的编译。

七、编译xpdf

7.1 设置编译参数

(1) 在xpdf源码目录下新建bulid文件夹,

(2) 打开vs2015的命令提示符工具(看你的vs版本),并进入build路径(ctrl+c后在命令框右键即可粘贴)

Qt之显示PDF文件_第29张图片

Qt之显示PDF文件_第30张图片

输入如下命令,设置各个库的包含路径和动态库的路径

cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DFREETYPE_LIBRARY="E:/qt5.9.5/userfile/20231005/xpdf-4.04/freetype/freetype.dll" -DFREETYPE_DIR="E:/qt5.9.5/userfile/20231005/xpdf-4.04/freetype-2.12.0" -DPNG_PNG_INCLUDE_DIR="E:/qt5.9.5/userfile/20231005/xpdf-4.04/libpng-1.6.35" -DPNG_LIBRARY="E:/qt5.9.5/userfile/20231005/xpdf-4.04/libpng/libpng16.dll" -DZLIB_LIBRARY="E:/qt5.9.5/userfile/20231005/xpdf-4.04/zlib/zlibwapi.dll" -DZLIB_INCLUDE_DIR="E:/qt5.9.5/userfile/20231005/xpdf-4.04/zlib" ..

Qt之显示PDF文件_第31张图片

我的结果如下:

E:\qt5.9.5\userfile\20231005\xpdf-4.04\build>cmake -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release -DFREETYPE_LIBRARY="E:/qt5.9.5/userfile/20231005/xpdf-4.04/freetype/freetype.dll" -DFREETYPE_DIR="E:/qt5.9.5/userfile/20231005/xpdf-4.04/freetype-2.12.0" -DPNG_PNG_INCLUDE_DIR="E:/qt5.9.5/userfile/20231005/xpdf-4.04/libpng-1.6.35" -DPNG_LIBRARY="E:/qt5.9.5/userfile/20231005/xpdf-4.04/libpng/libpng16.dll" -DZLIB_LIBRARY="E:/qt5.9.5/userfile/20231005/xpdf-4.04/zlib/zlibwapi.dll" -DZLIB_INCLUDE_DIR="E:/qt5.9.5/userfile/20231005/xpdf-4.04/zlib" ..
-- The C compiler identification is MSVC 19.0.24215.1
-- The CXX compiler identification is MSVC 19.0.24215.1
-- Check for working C compiler: F:/vs2015/VC/bin/cl.exe
-- Check for working C compiler: F:/vs2015/VC/bin/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: F:/vs2015/VC/bin/cl.exe
-- Check for working CXX compiler: F:/vs2015/VC/bin/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Looking for mkstemp
-- Looking for mkstemp - not found
-- Looking for mkstemps
-- Looking for mkstemps - not found
-- Looking for popen
-- Looking for popen - not found
-- Performing Test HAVE_STD_SORT
-- Performing Test HAVE_STD_SORT - Success
-- Looking for fseeko
-- Looking for fseeko - not found
-- Looking for fseek64
-- Looking for fseek64 - not found
-- Looking for _fseeki64
-- Looking for _fseeki64 - found
-- Found FreeType (old-style includes): E:/qt5.9.5/userfile/20231005/xpdf-4.04/freetype/freetype.dll
-- Found ZLIB: E:/qt5.9.5/userfile/20231005/xpdf-4.04/zlib/zlibwapi.dll
-- Found PNG: E:/qt5.9.5/userfile/20231005/xpdf-4.04/libpng/libpng16.dll (found version "1.6.35")
-- Qt5 found
-- Looking for pthread.h
-- Looking for pthread.h - not found
-- Found Threads: TRUE
-- Configuring done
-- Generating done
-- Build files have been written to: E:/qt5.9.5/userfile/20231005/xpdf-4.04/build

7.2 开始编译

在命令框输入:

nmake

我失败在如下这一步(2023-10-05)

Qt之显示PDF文件_第32张图片

你可能感兴趣的:(001QT桌面程序编程,pdf,xpdf库,编译,windows,vs2015)