admin管理员组文章数量:1621481
文章目录
- 概要
- 方案一
- 方案二
- 一、介绍
- 二、编译
- 三、用法
- 本项目代码
概要
在qt程序中,要实现PDF文件浏览,从网上目前找到了两种解决方案,本文主要介绍下着两种方案和适用性。
方案一
这种方法是从https://github/develtar/qt-pdf-viewer-library 提供的一个框架,集成方法和效果都不错,唯一的缺点是占用的内存太大,在嵌入式设备上不适用,故放弃了,
使用Qt的WebEngine和javascript的pdf.js模块构建的PDF查看器,故需要支持webview 也是占用内存较大的原因
效果如图:
方案二
集成pdfium,当然高版本的QT已经自带pdf功能。
一、介绍
pdfium.dll 是 Adobe 开源的一款 PDF 渲染引擎。它是一个跨平台的库(支持 Windows、Linux、MacOS 等多个平台),功能强大且易于使用。pdfium.dll 不仅支持 PDF 文件的解析、渲染、打印,还能够嵌入到自己的应用程序中使用。
pdfium.dll 的开源地址在 GitHub 上,对于开发者来说非常友好,文档详细且示例丰富。几乎可以做到零开发成本,就能够使用 pdfium.dll 库为自己的应用程序添加 PDF 渲染功能。
二、编译
QtPdfium 是一个Qt模块,主要用于操作和显示PDF文件。该模块核心功能使用了pdfium工程,它是Google的一个开源项目(BSD);
一、编译安装步骤
1、Mac/Linux代码编译和安装使用
git clone –recursive https://github/paulovap/qtpdfium
cd qtpdfium
qmake
make
make install (might need sudo)
三、用法
QtPdfium 导出两个重要类:QPdfium 和 QPdfiumPage.
1、包含头文件#include <QtPdfium/QtPdfiumDepends>
2、通过PDF文件名称生产QPdfium对象 QPdfium pdfium(strPDFFileName);
3、通过QPdfium生成QPdfiumPage 对象
//获取PDF文件包含的页数
int nPageCn = pPdfium->pageCount();
//获取指定的页
QPdfiumPage pfPage = pPdfium->page(i);
//由QpdfiumPage生成Qimage
QImage pdfImage = pfPage.image();
//….显示等
本项目代码
class PdfImageProvider : public QObject, public QQuickImageProvider
{
Q_OBJECT
Q_PROPERTY(bool ready READ ready NOTIFY readyChanged)
public:
QPdfium *m_pdf = nullptr;
explicit PdfImageProvider()
: QQuickImageProvider(QQuickImageProvider::Image)
//, m_pdf(new QPdfium())
{
}
virtual ~PdfImageProvider() {}
QImage requestImage(const QString &id, QSize *size, const QSize &requestedSize) override
{
Q_UNUSED(requestedSize);
if (!m_pdf || !m_pdf->isValid()) {
qDebug() << "Unable to load pdf";
return QImage();
}
qDebug() << __func__ << requestedSize;
int i = id.toInt();
auto page = m_pdf->page(i);
// qreal scale = requestedSize.isValid() ?
// requestedSize.width()/(qreal)page.width() :
// 2;
qreal scale = 1200/(qreal)page.width();
qDebug() << __func__ << page.width() << page.height() << scale;
auto image = page.image(scale);
qDebug() << __func__ << image.width() << image.height() << scale;
size->setWidth(image.width());
size->setHeight(image.height());
return image;
}
Q_INVOKABLE bool ready() {
return m_pdf != nullptr && m_pdf->isValid();
}
Q_INVOKABLE int pageCount() {
return m_pdf->pageCount();
}
Q_INVOKABLE void setFilename(QString filename) {
m_pdf->loadFile(filename);
Q_EMIT readyChanged(m_pdf->isValid());
}
Q_INVOKABLE QString pageText(int index) {
return m_pdf && m_pdf->isValid() ? m_pdf->page(index).text() : "";
}
Q_INVOKABLE void creatPdfium()
{
qDebug() << __func__ << m_pdf;
if(m_pdf == nullptr)
m_pdf = new QPdfium();
}
Q_INVOKABLE void releasePdfium()
{
if(m_pdf != nullptr)
{
delete m_pdf;
m_pdf = nullptr;
}
}
Q_SIGNALS:
void readyChanged(int);
};
版权声明:本文标题:qt 实现pdf阅读器 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1728835931a1176044.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论