Как я могу использовать Poppler-QML-плагин в моем приложении? - PullRequest
0 голосов
/ 16 октября 2018

Привет, ребята, я нашел в этом хранилище

https://github.com/dept2/Poppler-QML-plugin

плагин qml для отображения PDF-файла в qml-файл, но я не знаю, как яможет кто-то может мне помочь?

В версии Ubuntu 18.04 я нашел этот плагин с командной строкой sudo apt-cache search poppler и установил пакет, но у меня та же проблема, как я могу его использовать?

Спасибозаранее

1 Ответ

0 голосов
/ 17 октября 2018

Есть 2 возможных метода:

1.Скомпилируйте и установите плагин:

Чтобы установить этот пакет, я должен установить плагин, чтобы сначала загрузить проект, открыть терминал в каталоге проекта и выполнить следующее:

qmake
make
sudo make install

Затемв импортируемом модуле .qml элемент Poppler предоставляет imageProvider, поэтому вы должны использовать изображение, как показано ниже:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Layouts 1.11
import org.docviewer.poppler 1.0 // <--- import
import QtQuick.Dialogs 1.3

Window {
    id: win
    visible: true
    width: 640
    height: 480
    title: qsTr("Poppler Example")

    function urlToPath(urlString) {
        var s
        if (urlString.startsWith("file:///")) {
            var k = urlString.charAt(9) === ':' ? 8 : 7
            s = urlString.substring(k)
        } else {
            s = urlString
        }
        return decodeURIComponent(s);
    }

    FileDialog {
        id: fileDialog
        title: "Please choose a file"
        folder: shortcuts.home
        nameFilters: ["PDF files (*.pdf)", "All files (*)"]
        onAccepted: timer.running = true
        Component.onCompleted: visible = true
    }

    Timer {
        id: timer
        interval: 100; repeat: false
        onTriggered: {
            poppler.path = urlToPath(""+fileDialog.fileUrl)
            view.focus = true
        }
    }

    Poppler{
        id: poppler
    }

    ListView{
        id: view
        height: parent.height
        width: 100
        model: poppler.numPages
        delegate:  Image{
            id: image
            width: parent.width
            source: poppler.loaded? "image://poppler/page/" + (modelData+1): ""
            sourceSize.width: width
            MouseArea{
                anchors.fill: parent
                onClicked: {
                    image.ListView.view.currentIndex = index
                    image.ListView.view.focus = true
                }
            }
        }
    }
    Flickable {
        height: parent.height
        anchors.left: view.right
        anchors.right: parent.right
        contentWidth: bigImage.width;
        contentHeight: bigImage.height
        boundsBehavior: Flickable.StopAtBounds
        Image{
            id: bigImage
            sourceSize.width: win.width - view.width
            source: (poppler.loaded && view.currentIndex >= 0)?  "image://poppler/page/"+(view.currentIndex+1): ""
        }
    }
}

Вывод:

enter image description here


2.Создать .pri

Я создал .pri, простой способ прикрепить файлы к проекту:

poppler-qml.pri:

INCLUDEPATH += $$PWD

SOURCES += \
    $$PWD/pdfModel.cpp \
    $$PWD/pageImageProvider.cpp

HEADERS += \
    $$PWD/pdfModel.h \
    $$PWD/pageImageProvider.h


unix|win32: LIBS += -lpoppler-qt5

файлы должны иметь следующую структуру:

poppler-qml
    ├── pageImageProvider.cpp
    ├── pageImageProvider.h
    ├── pdfModel.cpp
    ├── pdfModel.h
    └── poppler-qml.pri

и затем добавить их в ваш .pro:

...
include(poppler-qml/poppler-qml.pri)

и main.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <pdfModel.h>

int main(int argc, char *argv[])
{
    qputenv("POPPLERPLUGIN_DEBUG", "1"); /// enable debug
    qmlRegisterType<PdfModel>("org.docviewer.poppler", 1, 0, "Poppler");
    ...

Например,в следующей ссылке вы можете найти пример.

Примечание:

В исходном коде плагина есть ошибка, потому что, если он запрашиваетстраница, которая не существует, приложение должно вернуть QImagenulo, но так как она не выполняет проверку, приложение может быть повреждено

page = document->page(numPage -1);
if(!page)
    return result;
...