Delphi для android pdf

Обзор: 5 решений для создания и работы с PDF в Delphi.

Пообещал я на днях одному многоуважаемому человеку, что на выходных гляну исходник клиента для DelphiFeeds.ru в плане сборки этого приложения под iOS в Delphi XE4. Собственно, глянуть-то я его глянул, но толкового решения в плане безболезненного переноса по iOS так и не нашел (и переделывание интерфейса оказалась не такой уж и большой проблемой в сравнении с другими). Вообще, перенос проектов FireMonkey с Delphi XE3 на Delphi XE4 -заслуживает отдельного поста, но, в целях соблюдения политкорректности, я оставляю эту тему кому-нибудь другому. Зато обнаружил, что сервис по созданию PDF-файлов из HTML-страниц успешно “загнулся” и теперь в клиенте создаются только mht-файлы. Это обстоятельство и привело к написанию этого небольшого обзора компонентов и решений для создания PDF-файлов в Delphi.

Помня некоторые из замечаний по поводу обзора “23 решения для локализации и интернационализации приложений“, сразу оговорюсь:

  1. Вся информация относительно цены, лицензии, поддерживаемых версий Delphi берётся исключительно с официальных сайтов разработчиков на момент написания этого обзора. Дата обзора 10 июня 2013 года .
  2. Если Вы сейчас читаете этот пост и точно знаете, что какой-либо компонент из обзора прекрасно поддерживает работу в XE6/7/8 и т.д., а в обзоре сказано только про XE3, то сегодня точно не 2013 год и, следовательно, см. п.1.
  3. Работа всех компонентов проверялась на Delphi XE3 и только на Delphi XE3

1. Synopse PDF Engine

  • Стоимость: Free
  • Лицензия: MPL/GPL/LGPL tri-license.
  • Поддерживаемые версии Delphi: 5-XE3
  • Страница загрузки: http://synopse.info/fossil/wiki?name=PDF+Engine

Возможности, заявленные разработчиками:

  1. Чистый Delphi-код без использования сторонних DLL
  2. Маленький размер, создаваемых pdf-файлов
  3. Быстрая генерация pdf с минимальным использованием памяти
  4. Доступ к TCanvas для рисования линий, кривых, текста и т.д.
  5. Поддержка Unicode
  6. Создание PDF/A-1 файлов.

При работе с Synopse PDF Engine ничего устанавливать не требуется – достаточно указать в проекте путь к модулям Synopse и подключить модуль synpdf.pas в uses.

В результате выполнения этого кода у меня получился PDF-документ вот с таким содержимым:

Как видно на рисунке, при вводе в PDF юникодного текста возможно появление каких-то непонятных символов.

Что касается печати PDF из HTML-страниц, то, судя по описанию возможностей Synopse PDF Engine на официальном сайте, сделать это возможно, но с использованием других компонентов из набора Synopse. Поэтому я отложил Synopse PDF Engine в сторонку (может потом пригодиться) и начал искать другие решения.

2. PowerPDF

  • Стоимость: Free
  • Лицензия: Mozilla Public License 1.1 (MPL 1.1).
  • Поддерживаемые версии Delphi: 2007-XE3
  • Страница загрузки: http://sourceforge.net/projects/powerpdf/

PowerPDF представляет собой набор визуальных компонентов для создания PDF-документов. В набор входит несколько компонентов, таких как TPDFImage, TPDFText, TPDFAnnotation и т.д. После установки компонентов на палитре появится закладка PowerPDF с которой нам и предстоит в дальнейшем работать.

В zip-архиве с библиотекой PowerPDF Вы также найдете массу различных примеров использования PowerPDF, в т.ч. создания PDF-файлов с картинками, различные способы работы с текстом, шрифтами, выгрузка данных из БД и т.д.

Читайте также:  Симс 4 андроид 4pda

В целом PowerPDF выглядит довольно презентабельно и серьезно, но для решения моей задачи мало подходит, т.к. мне необходим именно невизуальный компонент для создания PDF из web-странички. Если же Вам нужны бесплатные компоненты для создания отчетов в PDF-формате, то посмотрите PowerPDF – вполне возможно, что эти компоненты Вам подойдут.

Пример PDF-документа, созданного с помощью PowerPDF

3. HotPDF

Стоимость: от 110 до 300$
Поддерживаемые версии Delphi: 7-XE4
Страница загрузки trial-версии: http://www.loslab.com/HotPDF.html

Возможности компонента, заявленные разработчиками:

  • Поддержка векторной и растровой графики в PDF-документах
  • Защита PDF-документов паролем
  • Поддержки AcroForms/PDF-форм
  • Водяные знаки
  • Генерация PDF документов с внутренними и внешними ссылками, веб-ссылками и закладками
  • Полная поддержка Unicode
  • Поддержка различных шрифтов, форматирование текста, расположение текста в несколько столбцов
  • Поддержка TCanvas
  • Встроенный архиватор для сжатия текстовой и графической информации в документе
  • Преобразование TIFF в PDF

В качестве примера, я решил собрать демонстрационное приложение, идущее в комплекте вместе с компонентом THotPDF. Приложение довольно простенькое – генерирует PDF-ку с двумя ссылками и простым текстом. Код тоже простой и понятный:

Даже не вдаваясь в тонкости работы компонента можно понять, что и как происходит в этом демонстрационном примере. Запускаем, смотрим на внешний вид сгенерированного документа:

Документ, созданные с помощью THotPDF

Вот эти два синих прямоугольника в документе – ссылки на две страниц…а простого текста “Click the link to navigate” вообще не наблюдается нигде. Хотя, надо отдать должное, при клике по прямоугольнику ссылка действительно открывается. В общем, то ли разработчики поторопились заявить поддержку Delphi вплоть до XE3, то ли это так интересно работает trial-версия, но после запуска этого демонстрационного примера у меня как-то отпало желание использовать THotPDF даже за бесплатно. Двигаемся далее.

4. PDF Creator Pilot

Стоимость: от 450$ без исходников до 9950$ (. ) с исходниками
Поддерживаемые версии Delphi: 5-XE4
Страница загрузки trial-версии: http://www.colorpilot.com/pdflibrary.html#download

Библиотека стоимостью почти как Delphi XE3 Professional…Ну да ладно, посмотрим, что представляет из себя эта библиотечка.

Возможности, заявленные разработчиками:

  • Расширенный набор методов и свойств для легкого создания PDF;
  • Чтение и слияние существующих PDF-документов;
  • Добавление и удаление страниц PDF-документа;
  • Поддержка юникода;
  • Создание водяных знаков для каждой страницы;
  • Добавление эскизов для PDF-документа;
  • Использование и встраивание шрифтов (TrueType, OpenType, Type1 и т.д.);
  • Создание интерактивных PDF-документов, используя JavaScript и гиперссылки;
  • Поддержка интерактивных элементов AcroForm: текстовые поля ввода, кнопки, радио-кнопки, выпадающие списки, флажки;
  • шифрование и защита паролем созданных PDF-документов;
  • Создания и управление содержанием документа;
  • Доступ к HDC для рисования на PDF-страницах с помощью WinAPI функций.
  • Использование изображений в различных форматах (JPEG, TIFF, PNG, BMP, GIF);
  • Создание и использование аннотаций;
  • Создание PDF-документов на диске или в памяти;
  • Извлечения текста из PDF документов;

В общем, довольно внушительный список возможностей. Посмотрим как некоторые из этих возможностей работают на практике. Скачиваем демонстрационную версию, устанавливаем.

После установки запускаем Delphi (в моем случае – это Delphi XE3) и переходим в меню:

Component – Import Component – Import Type Library

В списке ищем библиотеку PDFCreatorPilot:

Импортируем, создаем новый проект и подключаем в uses модуль PDFCreatorPilotLib_TLB.

Читайте также:  Лучший усилитель громкости для андроид

Теперь можем протестировать работу библиотеки на каком-нибудь живом примере. Вначале попробуем сгенерировать документ с простым текстом:

Источник

Opening a PDF on Android with Delphi

Intents on Android using API 26 to open PDF documents.

Recently, the Google Play store updated its requirements so the target API level of 26 was used to get new apps submitted. While this was reasonably easy to achieve through updating the AndroidManifest.Template, the change to the newer API changed the behaviour of my application.

Before the update, I would download a file to the CachePath and then share to a public folder. I would then get a URI for the public folder path file and share via Intents. Following the update, this no longer worked. After a little research, I discovered this was due to the changes in the Android security system, that actually, make a lot of sense. Rather than sharing the file outside the application, you now provide tempory access to it via the Intent. To achieve this, you need to setup a Provider, (this is done via XML) and then programmatically provide the path as a ‘content://’ URI, set flags for allowing read / write access via the intent and share it.

The video shows how to achieve this and demo’s the working code. To help, below are some of the XML blocks you will need upon the way.

Adding Provider

Add this to the AndroidManifest.template in the source code root folder, before the tag. This is then used to build all Android apps.

Provider file

Create a fileprovider.xml (or whatever file name you set in android:resource when declaring the provider).

More flags and details for Provider Files can be found on the Android documentation

Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today

Источник

Работа с PDF. Чтение PDF-файлов

Android не всегда умел работать с PDF-файлами. Вплоть до версии Android 4.4 KitKat (API 19) у нас не было возможности просматривать PDF-файлы, кроме как используя сторонние приложения, такие как Google Drive PDF Viewer или другой нативный ридер на устройстве.

Начиная с Android 5.0 Lolipop (API 21) появилось API под названием PDFRenderer, с помощью которого можно выводить содержимое PDF-файлов. В этой статье мы создадим приложение, которое открывает PDF-файлы на устройстве для чтения.

Создадим новый проект, указав для него минимальную версию SDK Android 5.0 Lolipop. Для навигации приложения и дальнейшей работы с ним выберем Navigation Drawer Activity.

Шаг 1. Создание списка PDF-файлов

Перед тем, как начать работу, нужно предоставить приложению разрешения. Для этого в AndoridManifest.xml добавим следующие разрешения на чтение и запись.

На MainActivity мы будем получать список PDF-файлов, которые находятся в хранилище устройства. Для этого на файле разметки content_main.xml добавим компонент ListView.

Также нужно создать разметку для элемента в списке. Создадим в res/layout файл разметки list_item.xml и добавим в него следующий код.

Найденные файлы нужно сохранять в модель, чтобы затем передать в список. Для этого создадим класс PdfFile, в котором будут определены 2 поля (имя файла и путь), а также сеттеры и геттеры для изменения полей.

Читайте также:  Http android club ru

После этого в коде активности перед началом работы нужно проверить версию Android. Если версия ниже Android 6.0 M — инициализируем создание списка, в противном случае нужно проверить разрешения.

Метод checkPermission() проверяет наличие разрешения на чтение внешнего хранилища. Если разрешения имеются, то инициализируем создание списка, иначе запрашиваем разрешения. Пользователю будет показан диалог, предлагающий предоставить приложению разрешение, результат этого вернётся в метод onRequestPermissionsResult() активности.

В методе initViews() нам нужно инициализировать список. Для этого вызываем внутри метод initList(), который будет рекурсивно вызываться до тех пор, пока не будет проверен каждый каталог. В результате выполнения initList() будет заполнен список найденными PDF-файлами, который затем будет передан в адаптер. В адаптере переопределяются методы в соответствии с тем, что нам нужно, в частности в методе getView() мы получаем созданную для элемента разметку и устанавливаем в поле имя файла.

Шаг 2. Создание активности для просмотра

Здесь мы создадим активность, в которой будет просматриваться выбранный PDF-файл. Отрендеренная страница PDF будет загружаться в компонент ImageView. Также здесь будут располагаться кнопки переключения страниц и увеличения/уменьшения масштаба страницы.

Добавим Empty Activity, назвав PdfActivity, и в коде разметки активности добавим следующий код.

При запуске активности в методе onCreate() получаем имя и путь файла из интента, а также определяем компоненты и устанавливает слушатели на кнопки.

Затем в методе onStart() вызывается метод openPdfRenderer(), в котором происходит получение дескриптора файла для поиска PDF и создание объекта PdfRenderer. После этого вызывается метод displayPage(), который рендерит выбранную страницу.

Что касается метода displayPage(), в нём для каждой страницы, которую нужно отрендерить, открываем эту страницу, рендерим её и закрываем страницу. В результате рендера страница сохраняется в Bitmap с заданными размерами и зумом, после чего загружается в ImageView.

Обработчики кнопок вынесены в onClick(), здесь ничего особенного нет: кнопки «Назад» и «Вперёд» изменяют текущий индекс страницы в нужную сторону и вызывают метод displayPage(), аналогично кнопки зума изменяют уровень зума и вызывают метод displayPage() с текущим индексом.

Для того, чтобы при перевороте экрана запомнить текущий индекс страницы, переопределён метод onSaveInstanceBundle(), в котором в бандл помещается индекс страницы. Затем этот индекс забирается в onCreate() активности, что было показано выше.

При завершении работы и закрытии активности нужно закрыть PdfRenderer, для этого в переопределённом методе onStop() вызывается метод closePdfRenderer(), в котором удаляются все данные рендера.

В результате получилось простое приложение, способное открывать и показывать PDF-файлы.

Заключение

В этой статье мы рассмотрели, как можно использовать PdfRenderer API для отображения PDF-файлов в приложении. В следующей статье мы рассмотрим, как создать свой PDF-файл.

Работа с PDF. Чтение PDF-файлов : 2 комментария

Доброго времени суток.
Всё круто, но)
Для рендеринга нужно что бы страница умещалась во вьюху
// определяем размеры Bitmap
int newWidth = (int) (getResources().getDisplayMetrics().widthPixels * curPage.getWidth() / 72
* currentZoomLevel / 40);//45

int newHeight = (int) (getResources().getDisplayMetrics().heightPixels * curPage.getHeight() / 72
* currentZoomLevel / 65);//90

Bitmap bitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);
Matrix matrix = new Matrix();
float dpiAdjustedZoomLevel = currentZoomLevel * DisplayMetrics.DENSITY_MEDIUM
/ getResources().getDisplayMetrics().densityDpi;
matrix.setScale(dpiAdjustedZoomLevel, dpiAdjustedZoomLevel);
curPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
Далее, вместо скролов и ImageView, я сделал так:

Отлично маштабируется и намного приятнее)
Но всё равно спасибо, статья неплохая.

Источник

Оцените статью