Git Product home page Git Product logo

htmltopdfwrapper's Introduction

HtmlToPdfWrapper

Описание

HtmlToPdf wrapper - это библиотека, построенная на основе библиотеки Webkit, предназначенная для прямого вызова конвертации HTML в PDF посредством Java через Java Native Interface (JNI). Библиотека предназначена для использования в 64-битных Linux-системах (семейства Debian и RedHat, на других не проверялось). Собранные библиотеки расположены в директории build/libs. Для удобства так же автоматически собираются пакеты для систем, которые расположены в директории build/packages.

Если вы желаете самостоятельно собрать библиотеку на собственной системе, смотрите раздел "Разработка".

Источники

Convert HTML to PDF using Webkit (QtWebKit)
Official Site
Git repository
Settings

Установка

SO библиотека

Для установки достаточно разместить собранный wrapper в переменной окружения системы, где распалагаются все библиотеки. Обычно это диретория /usr/lib. Основным является файл вида libHtmlToPdfWrapper.so.1.0.1 (в зависимости от версии сборки), остальные файлы являются симлинками на этот файл. Поэтому, после копирования wrapper-а, требуется так же создать симлинки со смещением расширения до .so:

$ sudo cp build/libs/1.0.1/libHtmlToPdfWrapper.so.1.0.1 /usr/lib
$ cd /usr/lib
$ sudo ln -s libHtmlToPdfWrapper.so.1.0.1 libHtmlToPdfWrapper.so.1.0
$ sudo ln -s libHtmlToPdfWrapper.so.1.0.1 libHtmlToPdfWrapper.so.1
$ sudo ln -s libHtmlToPdfWrapper.so.1.0.1 libHtmlToPdfWrapper.so

Debian пакет

Если у вас установлен linux семейства Debian, вам достатчоно установить готовый Debian-пакет:

$ sudo dpkg i build/packages/libhtmltopdfwrapper_1.0.1-20160119_amd64.deb

RedHat пакет

Если у вас установлен linux семейства RedHat, вам достатчоно установить готовый RPM-пакет:

$ sudo dpkg i build/packages/libhtmltopdfwrapper-1.0.1-20160119.x86_64.rpm

Использование

// Создаем Wrapper
Wrapper wrapper = new Wrapper();

// Определяем наименования файлов истоников и назначения
String currPath = Paths.get(".").toAbsolutePath().normalize().toString();
String sourceLocalHtml = currPath + "/result/sources/QFileInfo_Class.html";
String destLocalResult = currPath + "/result/out/test_local.pdf";
String destLocalWithParamResult = currPath + "/result/out/test_local_with_param.pdf";
String sourceRemoteHtml = "http://patttern.blogspot.ru/2015/07/mariadb-nginx-php-fpm-centos-7-page5.html";
String destRemoteResult = currPath + "/result/out/test_remote.pdf";

// Выводим текущую версию wrapper-а
// Метод можно вызвать в любой момент
String version = wrapper.getVersion();
System.out.println("Текущая версия wrapper-а: " + version);

// Init wrapper
// Параметр функции указывает включать или не включать отладочный режим:
// true - отладочный режим включен
// false - отладочный режим выключен
wrapper.init(true);

/*
 * Конвертация локального файла
 */
// Сброс настроек
// После вызова wrapper.init(), сброс настроек вызывать не требуется, но ошибкой не будет.
wrapper.resetSettings();
// Назначаем файлы источника и назначения
wrapper.setSource(sourceLocalHtml);
wrapper.setDestination(destLocalResult);
// Вызов процесса конвертации
wrapper.convert();

/*
 * Конвертация файла с параметрами
 */
// Сброс настроек
wrapper.resetSettings();
// Назначаем файлы источника и назначения
wrapper.setSource(sourceLocalHtml);
wrapper.setDestination(destLocalWithParamResult);
// Назначаем глобальные параметры
GlobalSettings gs = new GlobalSettings();
gs.setColorMode(wrapper, "Grayscale");
// Назначаем параметры для PDF файла
ObjectSettings os = new ObjectSettings();
os.setPagesCount(wrapper, true);
// Вызов процесса конвертации
wrapper.convert();

/*
 * Конвертация файла через указание URL
 */
// Сброс настроек
wrapper.resetSettings();
// Назначаем файлы источника и назначения
wrapper.setSource(sourceRemoteHtml);
wrapper.setDestination(destRemoteResult);
// Вызов процесса конвертации
wrapper.convert();

// Завершение работы с wrapper-ом
// Уничтожаем все созданные объекты
wrapper.release();

Работу wrapper-а можно проверить в Java-классе test.patttern.Main.

Разработка

Вы можете добавить собственные функции для дальнейшего использования.

Добавление функционала

К примеру, требуется добавить, чтобы у wrapper-а появилась дополнительная функция hello.

Java

Java-проект построен с помощью IDE JetBrains IntelliJ Idea. Для добавления новой функции, ее требуется сначала описать в классе net.patttern.htmltopdf.Wrapper.

  public native static String hello(String param);

После того, как все функции вызова из Java описаны, требуется произвести компиляю header-файла для C++. Для этого достаточно вызвать скрипт compile, расположенный в корне проекта:

$ ./compile

Результатом работы скрипта будет перегенерированный файл build/src/net_patttern_htmltopdf_Wrapper.h.

C++

C++-проект построен с помощью IDE Qt Creator. После того, как был перегенерирован файл build/src/net_patttern_htmltopdf_Wrapper.h, требуется написать обработку для новых функций в файле build/src/net_patttern_htmltopdf_Wrapper.cpp. В данном примере, в файле build/src/net_patttern_htmltopdf_Wrapper.h появится новая запись:

/*
 * Class:     net_patttern_htmltopdf_Wrapper
 * Method:    hello
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_net_patttern_htmltopdf_Wrapper_hello
  (JNIEnv *, jclass, jstring);

Напишем обработчик функции, которая будет возвращать строку "Hello, " + входящий параметр.

JNIEXPORT jstring JNICALL Java_net_patttern_htmltopdf_Wrapper_hello (JNIEnv * jni, jclass jclass, jstring jname) {
  // cast-инг из 'jstring' в 'const char *'
  const char * name = jni->GetStringUTFChars(jname, NULL);
  QString message = "Hello, " + QString::fromUtf8(name);

  // уничтожаем jname и name, больше они нам не требуются
  jni->ReleaseStringUTFChars(jname, name);

  // cast-инг из 'const char *' в 'jstring'
  result = jni->NewStringUTF(message);
  return result;
}

После того, как все функции описаны, требуется собрать wrapper. Это производится из диретории build с помощью скрипта install. Так же, этот скрипт используется для полной перекомпиляции wrapper-а, если вы желаете его создать на собственной системе, даже если никаких изменений не производилось. При каждой сборке BUILD-версия wrapper-а инкрементируется на 1. MAJOR и MINOR версии wrapper-а устанавливаются в скрипте install (10-15 строки):

#==================================================
# MAJOR и MINOR версии библиотеки
#==================================================

PKGMAJOR=1
PKGMINOR=0

Если вы желаете изменить версию, требуется выставить нужную версию в соответсвующих параметрах. После этого требутся запустить компиляю:

$ cd build
$ ./install

В результате, в директории build/libs будет создан wrapper и симлинки на него, в директории build/packages будут пересобраны установочные пакеты.

Feedback

Нашли ошибку? Сообщите ее в Bug Tracker.

htmltopdfwrapper's People

Contributors

patttern avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.