<强>开发环境Qt5.5.1, Qt Creator 3.5.1 强>
Qt实现pdf阅读器和MFC实现pdf阅读器,其实原理都是差不多的。
需要用到荡漾开源库,下载地址如下https://poppler.freedesktop.org/
如果只是要在窗口的gcc下运行的话,可以下载已经编译好的库https://sourceforge.net/projects/poppler-win32/
INCLUDEPATH +=$ $ PWD/荡漾 win32:填词+=- l $ $ PWD/波普尔-llibpoppler win32:填词+=- l $ $ PWD/波普尔-llibpoppler-qt5
3,创建pdf工具类(该类负责与波普尔库做对接,主要负责获取pdf的总页数,和每页的图像)
<强> (1)pdfutils.h 强>
的ifndef PDFUTILS_H #定义PDFUTILS_H # include & lt; QObject> # include & lt; QImage> # include & lt; QSize> # include & lt; QDebug> # include“poppler-qt5.h” 类PdfUtils { 公众: 显式PdfUtils (QString filePath); ~ PdfUtils ();//获取指定页pdf图像(页码从0开始) 打印大师getPdfImage (int pageNumber);//获取pdf总页码 int getNumPages ();//获取pdf页面大小 QSize getPageSize (); 私人: QString filePath; int numPages; QSize页大小; 空白getPdfInfo (); }; # endif//PDFUTILS_H
<强> (2)pdfutils.cpp 强>
# include“pdfutils.h” PdfUtils:: PdfUtils (QString filePath) { 这→filePath=filePath; getPdfInfo (); } PdfUtils:: ~ PdfUtils () { } 打印大师PdfUtils:: getPdfImage (int pageNumber) { 打印大师形象; 波普尔::文档*文档=波普尔:文档::负载(filePath); 如果(!文档| |文档→isLocked ()) {//砦笙?... 删除文档; 返回图像; }//文档开始页面0 波普尔:页面* pdfPage=文件→页面(pageNumber); 如果(pdfPage==0) {//砦笙ⅰ? 返回图像; }//生成一个呈现页面的打印大师 形象=pdfPage→renderToImage (72、72、1, 1, 1, 1); 如果(image.isNull ()) {//砦笙ⅰ? 返回图像; }//使用后,必须删除的页面 删除pdfPage; 删除文档; 返回图像; } int PdfUtils: getNumPages () { 返回numPages; } QSize PdfUtils: getPageSize () { 返回页大小; } 空白PdfUtils: getPdfInfo () { numPages=0; 波普尔::文档*文档=波普尔:文档::负载(filePath); 如果(!文档| |文档→isLocked ()) {//砦笙?... 删除文档; 返回; } numPages=文档→numPages (); 波普尔:页面* pdfPage=文件→页面(0); 页大?pdfPage→页大小(); qDebug () & lt; & lt;页大小; 删除pdfPage; 删除文档; }
4, pdf显示类(pdf的右侧显示滚动条,①拖动滚动条翻页②鼠标拖动pdf到最上或最底时翻页)
<强> 强>
(1) mypdfcanvas。h(继承父类的resizeEvent是为了①当pdf只有1页时不显示滚动条②当用户拖动缩放窗口时动态改变pdf显示尺寸)
的ifndef MYPDFCANVAS_H #定义MYPDFCANVAS_H # include & lt; QWidget> # include & lt; QVector> # include & lt; QMouseEvent> # include & lt; QPaintEvent> # include & lt; QPainter> # include & lt; QPaintEvent> # include & lt; QMap> # include & lt; QPalette> # include & lt; QResizeEvent> # include“pdfutils.h” 类MyPdfCanvas:公共QWidget { Q_OBJECT 公众: 明确MyPdfCanvas (QWidget *父=0); ~ MyPdfCanvas (); 空白resizeEvent (QResizeEvent * e); 空白paintEvent (QPaintEvent * e); 空白mousePressEvent (QMouseEvent * e); 空白mouseReleaseEvent (QMouseEvent * e); 空摇干(QMouseEvent * e); 空白setMaxCachedNum (int maxCachedNum);//如果不能解析pdf返回错误的 bool setPath (QString pdfPath);//页码从0开始 bool setPage (int pageNumber);//获取页数 int getNumPages (); 浮动getScaledRatio ();//显示裁剪后的图片 bool showClipImage (int pageNumber, int x, int y, int, int h);//取消显示裁剪图片,恢复正常显示 空白cancelClip ();//实际获取的pdf宽高度 QSize pdfActualSize; 信号: 空白pageChanged (int currentPage); 私人: PdfUtils * PdfUtils; QString pdfPath;//最大缓存图片数量 int maxCachedNum;//用来缓存pdf的每一个页面的图像(从0开始) QMapQt使用波普尔实现pdf阅读器的示例代码