LibHaru — це вільна кросплатформна відкрита бібліотека для створення PDF файлів. На даний момент вона не підтримує читання і редагування існуючих PDF файлів.Сайт libHaru libHaru на SourceForge.net Open source PDF library for C/C++ application?

Бібліотека дозволяє: Генерувати PDF файли з текстом, векторною і растровою графікою. Використовувати закладки, анотації. Стискати документ з використанням алгоритму Deflate. Вбудовувати рисунки у форматах PNG і JPEG. Вбудовувати шрифти Type1 і TrueType. Створювати зашифровані PDF файли використовуючи потоковий шифр RC4 з довжиною ключа від 40 до 128 біт. Використовувати різні набори символів (ISO8859-1~16, MS CP1250~8, KOI8-R). Застосовувати китайські, корейські і японські шрифти (CID) і набори символів.

Створення PDF файлів за допомогою бібліотеки libHaru не потребує знання складностей внутрішньої структури PDF файлів.

Підтримувані компілятори і мови програмування

LibHaru написана на ANSI C і повинна компілюватись будь-яким компілятором, сумісним з ANSI C.

Вона тестувалась на наступних платформах: Cygwin + GCC (Microsoft Windows). Cygwin + MinGW (Microsoft Windows). MSYS + MinGW (Microsoft Windows). Microsoft VC++ (Microsoft Windows). Borland C++ (Microsoft Windows). GCC (Linux, FreeBSD, NetBSD, Solaris...).

Може використовуватись у вигляді статичної (.a, .lib) або динамічної (.so, .dll) бібліотек. У вигляді статичної бібліотеки її можна використовувати лише в мовах програмування C і C++. У вигляді динамічної бібліотеки може бути використана в будь-якій мові програмування, яка їх підтримує.

Біндінги бібліотеки доступні для таких мов програмування: C++PocoPDF C# Delphi Free Basic Free Pascal Python Ruby Visual Basic PHPБіндінг для PHP PerlБіндінг для PERL LuaLuaHPDF - біндінг для Lua JavaScripthpdf.js

Залежності

libHary використовує бібліотеку zlibzlib для стиснення даних і libpnglibpng для вбудовування рисунків у форматі PNG.

Приклади використання

Приклад використання в мові програмування C з обробником помилок: #include <stdio.h> #include <setjmp.h> #include <hpdf.h>

jmp_buf env;

#ifdef HPDF_DLL void __stdcall #else void #endif error_handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void *user_data) { /* виклик longjmp() у випадку виникнення помилки */ printf("ERROR: error_no=%04X, detail_no=%d\n", (unsigned int)error_no, (int)detail_no); longjmp(env, 1); }

int main() { /* встановлюємо обробник помилок під час створення об'єкта PDF_Doc */ HPDF_Doc pdf;

pdf = HPDF_New(error_handler, NULL); if (!pdf) { printf("ERROR: cannot create PdfDoc object\n"); return 1;

if (setjmp(env)) { HPDF_Free(pdf); return 1;

/* робота з документом * (перевіряти коди повернень функцій не потрібно) */

/* збереження документа у файл */ HPDF_SaveToFile(pdf, fname);

/* очищення */ HPDF_Free(pdf);

return 0; }

Приклад використання на C++: #include <cstdio> #include <stdexcept> #include <iostream> #include <hpdf.h>

#ifdef HPDF_DLL void __stdcall #else void #endif error_handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void *user_data) { // генерування виключення у випадку виникнення помилки char err_msg; sprintf(err_msg, "ERROR: error_no=%04X, detail_no=%d", (unsigned int)error_no, (int)detail_no); throw std::runtime_error(err_msg); }

int main() { HPDF_Doc pdf;

pdf = HPDF_New(error_handler, NULL); if (!pdf) { std::cout << "ERROR: cannot create PdfDoc object" << std::endl; return 1;

try { const char* message = "Hello, world!";

// завантаження стандартного шрифту Times Roman з набором символів за замовчуванням HPDF_Font font = HPDF_GetFont(pdf, "Times-Roman", NULL);

// додавання нової сторінки до документа і задання для неї шрифту HPDF_Page page = HPDF_AddPage(pdf); HPDF_Page_SetFontAndSize(page, font, 36);

// отримання ширини і висоти сторінки та довжини повідомлення const HPDF_REAL page_width = HPDF_Page_GetWidth(page); const HPDF_REAL page_height = HPDF_Page_GetHeight(page); const HPDF_REAL message_width = HPDF_Page_TextWidth(page, message);

// вивід повідомлення в центрі сторінки HPDF_Page_BeginText(page); HPDF_Page_TextOut(page, (page_width-message_width)/2, page_height/2, message); HPDF_Page_EndText(page);

// збереження результату у файл HPDF_SaveToFile(pdf, "helloworld.pdf");

} catch (std::exception& e) { std::cout << e.what() << std::endl; HPDF_Free(pdf); return 1;

// очищення HPDF_Free(pdf);

return 0; }

Підтримка кирилиці Підтримка кирилиці стандартними шрифтами PDF дуже обмежена. Для повноцінної її підтримки потрібно використовувати зовнішні шрифти. const char* font_path = "c:\\windows\\fonts\\times.ttf"; const char* font_name = HPDF_LoadTTFontFromFile(pdf, font_path, HPDF_TRUE); HPDF_Font font = HPDF_GetFont(pdf, font_name, "CP1251"); HPDF_Page_SetFontAndSize(page, font, 10); Джерела