Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: alexorleon от Январь 31, 2018, 15:27



Название: [РЕШЕНО] Просмотр PDF в приложении
Отправлено: alexorleon от Январь 31, 2018, 15:27
День добрый. Реализовал просмотр pdf документов в приложении на основе Poppler. Но сейчас появилась необходимость сбилдить проект под андроид. С poppler это показалось по меньшей мере крайне сложным процессом. WebView не рассматриваю поэтому решил попробовать другие библиотеки.
QtPDF http://blog.qt.io/blog/2017/01/30/new-qtpdf-qtlabs-module/
и
qtpdfium https://github.com/paulovap/qtpdfium

mupdf-qt собирал, но уже в самом проекте валились ошибки. Так и не разобрался.

Начал с QtPDF под linux.
Ubuntu 14.04 x64, Qt 5.9.3, gcc 4.8.4

Добавил в PATH qmake.

Проделал шаги.
git clone git://code.qt.io/qt-labs/qtpdf
cd qtpdf
git submodule update --init --recursive
qmake

Но на шаге с make ошибка:
...
cd src/ && ( test -e Makefile || /home/alexorleon/Qt/5.9.3/gcc_64/bin/qmake -o Makefile /home/alexorleon/Development/Projects/pdf/linux/qtpdf/src/src.pro ) && make -f Makefile
make[1]: Вход в каталог `/home/alexorleon/Development/Projects/pdf/linux/qtpdf/src'
cd lib/ && ( test -e Makefile || /home/alexorleon/Qt/5.9.3/gcc_64/bin/qmake -o Makefile /home/alexorleon/Development/Projects/pdf/linux/qtpdf/src/lib/lib.pro ) && make -f Makefile
make[2]: Вход в каталог `/home/alexorleon/Development/Projects/pdf/linux/qtpdf/src/lib'
g++ -c -pipe -O2 -fPIC -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -fno-exceptions -w -DNOMINMAX -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DOPJ_STATIC -DPNG_PREFIX -DPNG_USE_READ_MACROS -DV8_DEPRECATION_WARNINGS -DFT2_BUILD_LIBRARY -DOPJ_STATIC -DPNG_PREFIX -DPNG_USE_READ_MACROS -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -I. -I../3rdparty/pdfium -I../3rdparty/pdfium -I../3rdparty/pdfium/third_party/freetype/include -I../3rdparty/pdfium/third_party/freetype/include/freetype -I../3rdparty/pdfium/third_party -I../3rdparty/pdfium -I/home/alexorleon/Qt/5.9.3/gcc_64/mkspecs/linux-g++ -o .obj/cfx_systemhandler.o ../3rdparty/pdfium/fpdfsdk/cfx_systemhandler.cpp
g++: error: unrecognized command line option ‘-std=c++1z’
make[2]: * [.obj/cfx_systemhandler.o] Ошибка 1
make[2]: Выход из каталога `/home/alexorleon/Development/Projects/pdf/linux/qtpdf/src/lib'
make[1]: * [sub-lib-make_first-ordered] Ошибка 2
make[1]: Выход из каталога `/home/alexorleon/Development/Projects/pdf/linux/qtpdf/src'
make: *** [sub-src-make_first] Ошибка 2

Странно, ведь в этой версии g++ есть поддержка C++11.

Под андроид на make уже другая ошибка:
android_armv7 и в PATH добавил SDK, NDK.
...
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): перемещение 0 имеет недопустимый индекс символа 2
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
.obj/fpdfview.o: In function `FPDF_InitLibraryWithConfig':
/home/alexorleon/Development/Projects/pdf/android/qtpdf/src/lib/../3rdparty/pdfium/fpdfsdk/fpdfview.cpp:282: undefined reference to `IJS_Runtime::Initialize(unsigned int, void*)'
.obj/fpdfview.o: In function `FPDF_DestroyLibrary':
/home/alexorleon/Development/Projects/pdf/android/qtpdf/src/lib/../3rdparty/pdfium/fpdfsdk/fpdfview.cpp:295: undefined reference to `IJS_Runtime::Destroy()'
.obj/fsdk_mgr.o: In function `CPDFDoc_Environment::GetJSRuntime()':
/home/alexorleon/Development/Projects/pdf/android/qtpdf/src/lib/../3rdparty/pdfium/fpdfsdk/fsdk_mgr.cpp:216: undefined reference to `IJS_Runtime::Create(CPDFDoc_Environment*)'
collect2: error: ld returned 1 exit status
make[2]: * [qtpdfium] Ошибка 1
make[2]: Выход из каталога `/home/alexorleon/Development/Projects/pdf/android/qtpdf/src/lib'
make[1]: * [sub-lib-make_first-ordered] Ошибка 2
make[1]: Выход из каталога `/home/alexorleon/Development/Projects/pdf/android/qtpdf/src'
make: *** [sub-src-make_first] Ошибка 2

// ------------------------------
С qtpdfium тоже беда на make:

cd src/ && ( test -e Makefile || /home/alexorleon/Qt/5.9.3/gcc_64/bin/qmake -o Makefile /home/alexorleon/Development/Projects/pdf/linux/qtpdfium/src/src.pro ) && make -f Makefile
make[1]: Вход в каталог `/home/alexorleon/Development/Projects/pdf/linux/qtpdfium/src'
cd pdfium/ && ( test -e Makefile || /home/alexorleon/Qt/5.9.3/gcc_64/bin/qmake -o Makefile /home/alexorleon/Development/Projects/pdf/linux/qtpdfium/src/pdfium/pdfium.pro ) && make -f Makefile
Project MESSAGE: perl -w /home/alexorleon/Qt/5.9.3/gcc_64/bin/syncqt.pl -module QtPdfium -version 5.5.0 -outdir /home/alexorleon/Development/Projects/pdf/linux/qtpdfium /home/alexorleon/Development/Projects/pdf/linux/qtpdfium
<srcbase> = /home/alexorleon/Development/Projects/pdf/linux/qtpdfium
<outbase> = /home/alexorleon/Development/Projects/pdf/linux/qtpdfium
QtPdfium: created fwd-include header(s) for <srcbase>/src/pdfium/ { qpdfium.h (2), qpdfiumglobal.h (1), qpdfiumpage.h (2) }
QtPdfium: created version header
QtPdfium: created master header
QtPdfium: created headers.pri file
make[2]: Вход в каталог `/home/alexorleon/Development/Projects/pdf/linux/qtpdfium/src/pdfium'
perl /home/alexorleon/Qt/5.9.3/gcc_64/mkspecs/features/data/unix/findclasslist.pl < QtPdfium.version.in > QtPdfium.version
g++ -c -pipe -O2 -std=c++1z -fvisibility=hidden -fvisibility-inlines-hidden -Wall -W -Wvla -Wdate-time -Wshift-overflow=2 -Wduplicated-cond -fno-exceptions -D_REENTRANT -fPIC -D__QT__ -DOPJ_STATIC -DPNG_PREFIX -DPNG_USE_READ_MACROS -DQT_NO_VERSION_TAGGING -DQT_NO_NARROWING_CONVERSIONS_IN_CONNECT -DQT_BUILD_PDFIUM_LIB -DQT_BUILDING_QT -DQT_NO_CAST_TO_ASCII -DQT_ASCII_CAST_WARNINGS -DQT_MOC_COMPAT -DQT_USE_QSTRINGBUILDER -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050000 -DFT2_BUILD_LIBRARY -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -I. -I../../include -I../../include/QtPdfium -I/home/alexorleon/Development/Projects/pdf/linux/qtpdfium/include/QtPdfium/5.5.0 -I/home/alexorleon/Development/Projects/pdf/linux/qtpdfium/include/QtPdfium/5.5.0/QtPdfium -I../3rdparty/pdfium -I../3rdparty/pdfium/third_party/freetype/include -I../3rdparty/pdfium/third_party/freetype/include/freetype -I/home/alexorleon/Qt/5.9.3/gcc_64/include/QtCore/5.9.3 -I/home/alexorleon/Qt/5.9.3/gcc_64/include/QtCore/5.9.3/QtCore -I/home/alexorleon/Qt/5.9.3/gcc_64/include -I/home/alexorleon/Qt/5.9.3/gcc_64/include/QtGui -I/home/alexorleon/Qt/5.9.3/gcc_64/include/QtCore -I.moc -isystem /usr/include/libdrm -I/home/alexorleon/Qt/5.9.3/gcc_64/mkspecs/linux-g++ -o .obj/cba_annotiterator.o ../3rdparty/pdfium/fpdfsdk/cba_annotiterator.cpp
g++: error: unrecognized command line option ‘-std=c++1z’
g++: error: unrecognized command line option ‘-Wdate-time’
g++: error: unrecognized command line option ‘-Wshift-overflow=2’
g++: error: unrecognized command line option ‘-Wduplicated-cond’
make[2]: *** [.obj/cba_annotiterator.o] Ошибка 1
make[2]: Выход из каталога `/home/alexorleon/Development/Projects/pdf/linux/qtpdfium/src/pdfium'
make[1]: *** [sub-pdfium-make_first] Ошибка 2
make[1]: Выход из каталога `/home/alexorleon/Development/Projects/pdf/linux/qtpdfium/src'
make: *** [sub-src-make_first] Ошибка 2

Третий день уже бьюсь. Подскажите если кто такое делал.


Название: Re: Просмотр PDF в приложении
Отправлено: ViTech от Январь 31, 2018, 15:45
Цитировать
...
Ubuntu 14.04 x64, Qt 5.9.3, gcc 4.8.4
...
g++: error: unrecognized command line option ‘-std=c++1z’
...
Странно, ведь в этой версии g++ есть поддержка C++11.
...

‘-std=c++1z’ - это С++17, так что нужен компилятор поновее.


Название: Re: Просмотр PDF в приложении
Отправлено: alexorleon от Январь 31, 2018, 15:53
‘-std=c++1z’ - это С++17, так что нужен компилятор поновее.

Вот блин, а вроде только что гуглил. Спасибо, буду пробовать.


Название: Re: Просмотр PDF в приложении
Отправлено: alexorleon от Февраль 01, 2018, 10:15
Итак. Под линукс действия такие.
Добавляем С++17

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-7

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7

Теперь make отрабатывает стабильно. Пример pdfviewer можно запустить через Qt Creator. Все собирается, pdf открывается. Добавил код из примера к себе, изображение страницы создается.

Теперь под android. Тут пока не так все гладко. На этапе make снова та же ошибка:
...
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): перемещение 0 имеет недопустимый индекс символа 2
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
.obj/fpdfview.o: In function `FPDF_InitLibraryWithConfig':
/home/alexorleon/Development/Projects/pdf/android/qtpdf/src/lib/../3rdparty/pdfium/fpdfsdk/fpdfview.cpp:282: undefined reference to `IJS_Runtime::Initialize(unsigned int, void*)'
.obj/fpdfview.o: In function `FPDF_DestroyLibrary':
/home/alexorleon/Development/Projects/pdf/android/qtpdf/src/lib/../3rdparty/pdfium/fpdfsdk/fpdfview.cpp:295: undefined reference to `IJS_Runtime::Destroy()'
.obj/fsdk_mgr.o: In function `CPDFDoc_Environment::GetJSRuntime()':
/home/alexorleon/Development/Projects/pdf/android/qtpdf/src/lib/../3rdparty/pdfium/fpdfsdk/fsdk_mgr.cpp:216: undefined reference to `IJS_Runtime::Create(CPDFDoc_Environment*)'
collect2: error: ld returned 1 exit status
make[2]: *** [qtpdfium] Ошибка 1
make[2]: Выход из каталога `/home/alexorleon/Development/Projects/pdf/android/qtpdf/src/lib'
make[1]: *** [sub-lib-make_first-ordered] Ошибка 2
make[1]: Выход из каталога `/home/alexorleon/Development/Projects/pdf/android/qtpdf/src'
make: *** [sub-src-make_first] Ошибка 2

Такое ощущение, что QtPdf под андроид можно собрать только на винде используя компилятор VS.
Есть мысли по поводу IJS_Runtime, что за зверь и в чем может быть причина ошибки?


Название: [РЕШЕНО] Просмотр PDF в приложении
Отправлено: alexorleon от Февраль 06, 2018, 07:55
Собрал непосредственно в Qt Creator. Видимо через терминал чего-то не хватает.

Еще нужно добавить манифест и явно указать библиотеку в .pro файле с помощью ANDROID_EXTRA_LIBS

Всем спасибо!