Qt:使用 poppler 库打开 qrc pdf

Posted

技术标签:

【中文标题】Qt:使用 poppler 库打开 qrc pdf【英文标题】:Qt: opening qrc pdf with the poppler library 【发布时间】:2011-06-01 08:38:47 【问题描述】:

我在使用 poppler 库显示 pdf 的功能时遇到了一些问题。下面的代码就是出现问题的函数。

const QString &file 是文件的路径 int page 是它必须打开的页面

当我将文件设置为真实路径(例如“/Users/User/Documents/xxx.pdf”)时,打开它没有问题。但是当我给出一个 qrc 文件的路径(“:/files/xxx.pdf”)时,它就不起作用了。例如,我想用它在应用程序中显示用户手册。

我也尝试过先用它制作一个 QFile,打开它并执行 readAll,然后加载 doPoppler::Document::loadFromData(the qbytearray) 接收到的 QByteArray,但是在 ReadOnly 模式下打开 QFile 时它已经出错了。

void class::setPdf(const QString &file, int page)

    Poppler::Document *doc = Poppler::Document::load(file);
    if (!doc) 
        QMessageBox msgbox(QMessageBox::Critical, tr("Open Error"), tr("Please check preferences: cannot open:\n") + file,
                         QMessageBox::Ok, this);
        msgbox.exec();
    
    else /*Code for displaying the pdf, which works fine*/
    

希望你能帮助我,

你好,

马特

【问题讨论】:

你是如何用 QFile 打开它的?正常情况下,QFile 以 readOnly 模式从 qrc 读取资源没有任何麻烦... 【参考方案1】:

我也尝试过先制作一个 QFile 出它,打开它并做 readAll,然后加载 QByteArray 收到 做Poppler::Document::loadFromData( qbytearray),但它已经出错了 在 ReadOnly 中打开 QFile 时 模式。

QFile f;
f.setFileName(":/skin/AppIcon16.png");
f.open(QIODevice::ReadOnly);
QByteArray r=f.readAll();

完美地从资源中读取所有数据,已经检查过了。所以我建议你在尝试时做错了什么。也许是路径错误,也许是别的……

【讨论】:

该错误是来自 QFile 还是来自 Poppler::Document::loadFromData(qbytearray)? qfile,当我用 if(!f.open(QIODevice::ReadOnly) QMessageBox::information(this, tr("Unable to open file"), f.errorString() ); 它给出的输出可能已损坏(继续),但是当我加载相同的 pdf 时,然后是我的 HD 上的真实路径,它工作正常。可能是 qrc 中的 pdf 和 png 存在差异文件? 我不这么认为。 rcc 只是打包您放入的所有内容。所以也许你应该重新生成你的 rcc 文件。您能否从该文件中获取其他资源? 是的,我还有一个 .ini 文件,我从中检索页码,qDebugged 它并给出了正确的结果。还删除了 build-desktop 文件夹并重新编译了整个东西,三次检查了我提供的路径,但仍然...... 嗯……这很奇怪。我不知道你的pdf会发生什么......我仍然认为路径有问题,但是在哪里......

以上是关于Qt:使用 poppler 库打开 qrc pdf的主要内容,如果未能解决你的问题,请参考以下文章

你有 py-poppler-qt 的例子吗?

发生 qt5 错误 Poppler::Document* 文档

Poppler:以目标分辨率渲染

Python poppler Qt5 文档加载错误

将 pdf.js 与 Qt5.8 一起使用

从 PDF 中提取 xdp 或 xfa