Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: [Matrix] от Сентября 09, 2011, 00:31



Название: QT4 и pdf
Отправлено: [Matrix] от Сентября 09, 2011, 00:31
необходимо отображать pdf файлы в qt приложении. Пока что выбор пал на poppler, но не знаю получится ли собрать с помощью mingw и использовать его на windows. Интересует возможность использования его в приложениях с закрытым исходным кодом, будет использоваться через qt4, которая идет с lgpl...


Название: Re: QT4 и pdf
Отправлено: Nimbus от Сентября 09, 2011, 16:50
Тынц (http://www.prog.org.ru/index.php?topic=19251.msg130445#msg130445)


Название: Re: QT4 и pdf
Отправлено: [Matrix] от Сентября 09, 2011, 19:46
да, я читал это все вчера + гугл, получается что скомпилированные библиотеки можно взять из okular который в kdewin, относительно лицензий получается что я его буду использовать через qt4, которая под lgpl, собственно исходные тексты можно не показывать никому
вопрос только как dll к проекту подцепить
собственно интересует вопрос о не предоставлении исходных текстов



да, похоже сложно все с popplerom, пошел искать дальше


склоняюсь в сторону QAxWidget, осталось разобраться с лицензиями и загрузкой pdf


Название: Re: QT4 и pdf
Отправлено: [Matrix] от Сентября 11, 2011, 10:14
нашел вариант, который меня устраивает - загрузка pdf в QWebView

Код:
	    QString html = QString ("<html>\n"
 "<head>\n"
 "   <script type=\"text/javascript\">\n"
 "   <!--\n"
 "   function setWidth (width) {\n"
 "      document.getElementById (\"PdfReader\").style.width=width;\n"
 "   }\n"
 "   function setHeight (height) {\n"
 "      document.getElementById (\"PdfReader\").style.height=height;\n"
 "   }\n"
 "   //-->\n"
 "   </script>\n"
 "</head>"
 "<body>\n"
 "   <object id=\"PdfReader\" name=\"PdfReader\" width=\"%1\"
height=\"%2\"><embed src=\"file:///%3\" type=\"application/x-pdf\"/>\n"
 "</object>\n"
 "</body>\n"
 "</html>")
      .arg (width () - 20)
      .arg (height () - 20)
      .arg (m_tmpFileName);


первоисточник http://lists.qt.nokia.com/pipermail/qt-interest/2010-June/024543.html

не совсем подходит однако, нужна фильтрация ссылок которые есть в документе


Название: Re: QT4 и pdf
Отправлено: [Matrix] от Сентября 11, 2011, 21:33
более точно задача стояла так - отображать в qt приложении pdf документы, в которых должны быть ссылки, которые должны обрабатываться специальным образом в приложении (типа команды для приложения).

1 способ это написать драйвер для adobe, который будет обрабатывать ссылки. Затем после загрузки pdf документа с использованием QAxWidget, найти плагин загруженный acrobat'ом и проинициализировать его указателем на свой класс, которому будут передаваться ссылки и он их будет обрабатывать.

2 способ - загружать  pdf с использованием  html в qwebview. Для обмена данными использовать так называемый HostContainer. В качестве ссылок в pdf будут выступать куски кода на java - setAction(postMessage("ссылка_которую_нужно_обработать")). Затем после получения сообщения в html нужно сообщить о сообщении еще выше - QWebView.                                                  

____
на данный момент прорабатываю эти варианты на предмет реализации


все намного проще благодаря dumpcpp и QAxWidget


Название: Re: QT4 и pdf
Отправлено: PavelVX от Сентября 16, 2011, 10:46
Как у вас получилось это запустить?
Установил ридер 9.

Код:
	    QString html = QString ("<html>\n"
 "<head>\n"
 "   <script type=\"text/javascript\">\n"
 "   <!--\n"
 "   function setWidth (width) {\n"
 "      document.getElementById (\"PdfReader\").style.width=width;\n"
 "   }\n"
 "   function setHeight (height) {\n"
 "      document.getElementById (\"PdfReader\").style.height=height;\n"
 "   }\n"
 "   //-->\n"
 "   </script>\n"
 "</head>"
 "<body>\n"
 "   <object id=\"PdfReader\" name=\"PdfReader\" width=\"%1\"
height=\"%2\"><embed src=\"file:///d:/24.pdf\" type=\"application/x-pdf\"/>\n"
 "</object>\n"
 "</body>\n"
 "</html>")
      .arg (width () - 20)
      .arg (height () - 20);
        webViewContent->load(html);
Ничего не показывает!
Если же этот же код поместить в pdf.html и попробовать открыть через IE, то откроются панели инструментов ридера PDF, сам документ будет под ними, размером с эти панельки. :(.
Мне нужно всего лишь показать его в Qt?


Название: Re: QT4 и pdf
Отправлено: [Matrix] от Сентября 16, 2011, 14:34
да, pdf это та еще задача, отображение - это вс просто, а учет ссылок - жесть, как-будто в не могли разработчики сделать еще дополнительную обработку ссылок через свой класс путем регистрации callback.


PavelVX значит если нужно только отобразить, тогда задача решается следующим образом

в QT-консоли выполняется команда  dumpcpp.exe AcroPDF.PDF - получаются 2 файла, которые нужно добавить в проект. Полученный класс создается на основе COM-объекта от adobe.

Далее все сводится к вызову одного только метода load(имя_файла). Подробности смотри в примере во вложении, там показана загрузка файла. Пример этот я где-то находил и немного изменил
 
 

относительно Html - достаточно
Код:
<html>
<body>
<object id="PDFWrapper"
data="test.pdf"
type="application/pdf"
width="100%"
height="100%">
</object>
</body>
</html>




Название: Re: QT4 и pdf
Отправлено: PavelVX от Сентября 16, 2011, 16:55

в QT-консоли выполняется команда  dumpcpp.exe AcroPDF.PDF - получаются 2 файла, которые нужно добавить в проект. Полученный класс создается на основе COM-объекта от adobe.

Тут наверное имелось ввиду AcroPDF.DLL! Создал я таким образом 2 файла: cpp + h. Но твой маленький пример не работает :( Подумал, вдруг версии разные и заменил в твоем примере эти файлы на вновь созданные поверх, тоже не помогло.
Окно открывается, появляется белый квадрат и тишина. :(.
Также создал html файлик с твоим кодом. Скормил его IE, он переспросил, можно ли запускать доп компоненты, я согласился и только тогда он открыл pdf. Может в этом и проблема: в виджете не выскакивают предупреждения безопасности, поэтому все повисает и наступает облом :(.


Название: Re: QT4 и pdf
Отправлено: [Matrix] от Сентября 16, 2011, 17:15
у меня в виджете работает все, в браузере спрашивает про компоненты


Название: Re: QT4 и pdf
Отправлено: PavelVX от Сентября 16, 2011, 17:59
А sdk какой версии?
Можешь прям готовую прогу выложить на какой-нить обменник?
Я сейчас начал сливать последний sdk под вин, может в этом проблема.


Название: Re: QT4 и pdf
Отправлено: [Matrix] от Сентября 17, 2011, 18:23
прога не поможет, там в итоге получается завязка на адобовские библиотеки, полученный класс - это всего лишь интерфейс к их функциям. Я использовал 10-ю версию. потому что нужно было обрабатывать postMessage от документа


Название: Re: QT4 и pdf
Отправлено: [Matrix] от Сентября 22, 2011, 15:57
да, есть косяк в qt, может загружаться и отображаться pdf в qwebview, если отображать QWebView как show(), если вместо show() сделать его элементом диалога layout()->addWidget(webView), тогда не отображает. Если перед этим отобразить как show какой-нибудь pdf, потом другой объект Qwebview встроить в форму, тогда отображает


Название: Re: QT4 и pdf
Отправлено: PavelVX от Сентября 29, 2011, 15:20
к сожалению .. толи лыжи не едут, толи у меня опыта нет , но не показывает pdf :(
в качестве pdf просмотрщака стоит foxit reader 5.
Код:
#include <QtGui/QApplication>
#include <QWebView>

//#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QWebView view;
    QString html = QString ("<html>\n"
                      "<head>\n"
                      "   <script type=\"text/javascript\">\n"
                      "   <!--\n"
                      "   function setWidth (width) {\n"
                      "      document.getElementById (\"PdfReader\").style.width=width;\n"
                      "   }\n"
                      "   function setHeight (height) {\n"
                      "      document.getElementById (\"PdfReader\").style.height=height;\n"
                      "   }\n"
                      "   //-->\n"
                      "   </script>\n"
                      "</head>"
                      "<body>\n"
                      "   <object id=\"PdfReader\" name=\"PdfReader\" > "
                      "<embed src=\"file:///d:/test.pdf\" type=\"application/x-pdf\"/>\n"
                      "</object>\n"
                      "</body>\n"
                      "</html>");
            view.load(html);
    view.show();
//    MainWindow w;
//    w.show();

    return a.exec();
}