LibHaru

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

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

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

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

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

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

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

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

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

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

libHary використовує бібліотеку zlib[10] для стиснення даних і libpng[11] для вбудовування рисунків у форматі 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. https://github.com/libharu/libharu/releases/tag/v2.4.4
  2. Сайт libHaru [Архівовано 23 червня 2015 у Wayback Machine.](англ.)
  3. libHaru на SourceForge.net [Архівовано 10 серпня 2015 у Wayback Machine.](англ.)
  4. Open source PDF library for C/C++ application? [Архівовано 26 червня 2015 у Wayback Machine.](англ.)
  5. PocoPDF [Архівовано 26 червня 2015 у Wayback Machine.](англ.)
  6. Біндінг для PHP [Архівовано 7 жовтня 2008 у Wayback Machine.](англ.)
  7. Біндінг для PERL [Архівовано 24 червня 2015 у Wayback Machine.](англ.)
  8. LuaHPDF - біндінг для Lua [Архівовано 26 червня 2015 у Wayback Machine.](англ.)
  9. hpdf.js [Архівовано 25 червня 2014 у Wayback Machine.](англ.)
  10. zlib [Архівовано 17 вересня 2020 у Wayback Machine.](англ.)
  11. libpng [Архівовано 3 липня 2015 у Wayback Machine.](англ.)