LibHaru

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
libHaru
Тип бібліотека програм
Стабільний випуск 2.2.1 (19 липня 2008; 4017 днів тому)
Репозиторій github.com/libharu/libharu
Нестабільний випуск 2.3.0 RC2
Операційна система крос-платформова
Написано на ANSI C
Ліцензія Ліцензія zlib/libpng
libharu.org

LibHaru — це вільна кросплатформна відкрита бібліотека для створення PDF файлів. На даний момент вона не підтримує читання і редагування існуючих PDF файлів.[1][2][3]

Бібліотека дозволяє:

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

Підтримувані компілятори і мови програмування[ред. | ред. код]

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

Вона тестувалась на наступних платформах:

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

Біндінги бібліотеки доступні для таких мов програмування:

Залежності[ред. | ред. код]

libHary використовує бібліотеку zlib[9] для стиснення даних і libpng[10] для вбудовування рисунків у форматі 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[50];
    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);

Джерела[ред. | ред. код]

  1. Сайт libHaru(англ.)
  2. libHaru на SourceForge.net(англ.)
  3. Open source PDF library for C/C++ application?(англ.)
  4. PocoPDF(англ.)
  5. Біндінг для PHP(англ.)
  6. Біндінг для PERL(англ.)
  7. LuaHPDF - біндінг для Lua(англ.)
  8. hpdf.js(англ.)
  9. zlib(англ.)
  10. libpng(англ.)