Russian Qt Forum
Июля 05, 2025, 02:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT4 и pdf  (Прочитано 11633 раз)
[Matrix]
Гость
« : Сентября 09, 2011, 00:31 »

необходимо отображать pdf файлы в qt приложении. Пока что выбор пал на poppler, но не знаю получится ли собрать с помощью mingw и использовать его на windows. Интересует возможность использования его в приложениях с закрытым исходным кодом, будет использоваться через qt4, которая идет с lgpl...
« Последнее редактирование: Сентября 09, 2011, 00:39 от [Matrix] » Записан
Nimbus
Гость
« Ответ #1 : Сентября 09, 2011, 16:50 »

Тынц
Записан
[Matrix]
Гость
« Ответ #2 : Сентября 09, 2011, 19:46 »

да, я читал это все вчера + гугл, получается что скомпилированные библиотеки можно взять из okular который в kdewin, относительно лицензий получается что я его буду использовать через qt4, которая под lgpl, собственно исходные тексты можно не показывать никому
вопрос только как dll к проекту подцепить
собственно интересует вопрос о не предоставлении исходных текстов



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


склоняюсь в сторону QAxWidget, осталось разобраться с лицензиями и загрузкой pdf
« Последнее редактирование: Сентября 09, 2011, 23:30 от [Matrix] » Записан
[Matrix]
Гость
« Ответ #3 : Сентября 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

не совсем подходит однако, нужна фильтрация ссылок которые есть в документе
« Последнее редактирование: Сентября 11, 2011, 13:12 от [Matrix] » Записан
[Matrix]
Гость
« Ответ #4 : Сентября 11, 2011, 21:33 »

более точно задача стояла так - отображать в qt приложении pdf документы, в которых должны быть ссылки, которые должны обрабатываться специальным образом в приложении (типа команды для приложения).

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

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

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


все намного проще благодаря dumpcpp и QAxWidget
« Последнее редактирование: Сентября 11, 2011, 22:51 от [Matrix] » Записан
PavelVX
Гость
« Ответ #5 : Сентября 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?
« Последнее редактирование: Сентября 16, 2011, 11:38 от PavelVX » Записан
[Matrix]
Гость
« Ответ #6 : Сентября 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>


« Последнее редактирование: Сентября 16, 2011, 15:23 от [Matrix] » Записан
PavelVX
Гость
« Ответ #7 : Сентября 16, 2011, 16:55 »


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

Тут наверное имелось ввиду AcroPDF.DLL! Создал я таким образом 2 файла: cpp + h. Но твой маленький пример не работает Грустный Подумал, вдруг версии разные и заменил в твоем примере эти файлы на вновь созданные поверх, тоже не помогло.
Окно открывается, появляется белый квадрат и тишина. Грустный.
Также создал html файлик с твоим кодом. Скормил его IE, он переспросил, можно ли запускать доп компоненты, я согласился и только тогда он открыл pdf. Может в этом и проблема: в виджете не выскакивают предупреждения безопасности, поэтому все повисает и наступает облом Грустный.
Записан
[Matrix]
Гость
« Ответ #8 : Сентября 16, 2011, 17:15 »

у меня в виджете работает все, в браузере спрашивает про компоненты
Записан
PavelVX
Гость
« Ответ #9 : Сентября 16, 2011, 17:59 »

А sdk какой версии?
Можешь прям готовую прогу выложить на какой-нить обменник?
Я сейчас начал сливать последний sdk под вин, может в этом проблема.
Записан
[Matrix]
Гость
« Ответ #10 : Сентября 17, 2011, 18:23 »

прога не поможет, там в итоге получается завязка на адобовские библиотеки, полученный класс - это всего лишь интерфейс к их функциям. Я использовал 10-ю версию. потому что нужно было обрабатывать postMessage от документа
Записан
[Matrix]
Гость
« Ответ #11 : Сентября 22, 2011, 15:57 »

да, есть косяк в qt, может загружаться и отображаться pdf в qwebview, если отображать QWebView как show(), если вместо show() сделать его элементом диалога layout()->addWidget(webView), тогда не отображает. Если перед этим отобразить как show какой-нибудь pdf, потом другой объект Qwebview встроить в форму, тогда отображает
Записан
PavelVX
Гость
« Ответ #12 : Сентября 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();
}

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.029 секунд. Запросов: 18.