Просмотр PDF в QML WebView - PullRequest
       13

Просмотр PDF в QML WebView

1 голос
/ 14 марта 2019

Я хотел бы просмотреть PDF-файл в WebView, созданном в моем коде QML. Я импортирую QtWebView 1.1 и задаю свойству url путь к файлу PDF, но получаю эту ошибку:

[13044: 12820: 0314 / 144814,854: ОШИБКА: in_progress_cache_impl.cc (192)] Кэш не инициализирован, не может RetrieveEntry. [13044: 12820: 0314 / 144814,854: ОШИБКА: in_progress_cache_impl.cc (176)] Кэш не инициализирован, не может AddOrReplaceEntry. [13044: 12820: 0314 / 144814,854: ОШИБКА: in_progress_cache_impl.cc (192)] Кэш не инициализирован, не может RetrieveEntry.

Когда я использую тот же код для просмотра изображения, оно работает. Этот вопрос: Отображение PDF-файла с QWebView близко к тому, что я хочу, но, похоже, QML не дает мне доступ к методу настроек, как в C ++ ( Документы WebView ). Есть ли другой способ сделать это?

1 Ответ

3 голосов
/ 14 марта 2019

Кажется, что вы путаете элементы, QWebView принадлежит QtWebkit (использует Webkit), которого больше нет в Qt и который был заменен Qt WebEngine (использует хром). И еще одна вещь - это WebView Qt WebView, который использует нативные API (например, Android не поддерживает Qt WebEngine, но если WebView).

Qt WebEngine и Qt WebView изначально не поддерживают визуализацию PDF (Qt WenEngine поддержит ее очень скоро), поэтому решение состоит в том, чтобы использовать некоторую библиотеку js, которая делает это как PDF.js , так что это альтернатива что я предлагаю в базе для старого ответа .

*. Про

QT += quick webview
CONFIG += c++11
SOURCES += main.cpp
RESOURCES += qml.qrc

COPY_CONFIG = 3rdParty example.pdf
copy_cmd.input = COPY_CONFIG
copy_cmd.output = ${QMAKE_FILE_IN_BASE}${QMAKE_FILE_EXT}
copy_cmd.commands = $$QMAKE_COPY_DIR ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
copy_cmd.CONFIG += no_link_no_clean
copy_cmd.variable_out = PRE_TARGETDEPS
QMAKE_EXTRA_COMPILERS += copy_cmd

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QtWebView>

class PDFJS: public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString version READ version WRITE setVersion NOTIFY versionChanged)
    QString m_version;
public:
    QString version() const{
        return m_version;
    }
    void setVersion(QString version){
        if (m_version == version)
            return;
        m_version = version;
        Q_EMIT versionChanged(m_version);
    }
    Q_SIGNAL  void versionChanged(QString version);
    Q_INVOKABLE QUrl getUrl(const QUrl & path){
        QString pdfjs_path = QDir::current().filePath(QString("3rdParty/pdfjs-%1-dist/web/viewer.html").arg(m_version));
        QUrl pdf_url = QUrl::fromLocalFile(pdfjs_path);
        QUrlQuery query;
        query.addQueryItem("file", path.toString());
        pdf_url.setQuery(query);
        return pdf_url;
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    QtWebView::initialize();
    QQmlApplicationEngine engine;
    PDFJS pdfjs;
    engine.rootContext()->setContextProperty("applicationDirPath", QGuiApplication::applicationDirPath());
    engine.rootContext()->setContextProperty("PDFJS", &pdfjs);
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}
#include "main.moc"

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtWebView 1.1

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("PDFJS Example")
    WebView{
        id: webview
        anchors.fill: parent
    }
    Component.onCompleted:{
        PDFJS.version = "2.1.266"
        webview.url = PDFJS.getUrl("file://" + applicationDirPath + "/example.pdf")
    }
}

enter image description here

Вы можете найти полный проект здесь

Обновление: только QML

.
|-- 3rdParty
|   `-- pdfjs-2.1.266-dist
|-- example.pdf
`-- main.qml

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtWebView 1.1

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("PDFJS Example")
    WebView{
        id: webview
        anchors.fill: parent
    }
    Component.onCompleted:{
        var pdfjs_path = Qt.resolvedUrl("3rdParty/pdfjs-2.1.266-dist/web/viewer.html")
        var path = Qt.resolvedUrl("example.pdf");
        var url = pdfjs_path + "?file=%1".arg(path)
        console.log(url)
        webview.url = url
    }
}

Эта часть проекта вы найдете здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...