如何使用 libharu 将 utf-8 字符串打印到 pdf 文件中

How to print utf-8 strings into a pdf file useing libharu

提问人:Stefan Koch 提问时间:9/27/2023 最后编辑:ÐаnStefan Koch 更新时间:9/27/2023 访问量:68

问:

我正在尝试编写带有中文字符串的 PDF 文档。这些字符串在编码为 utf-8 的源代码中可用。

当我编译并运行以下内容(在 linux Debian 上)时,我收到“错误:error_no=1028,detail_no=0”的错误。

如果我将字体选择从“SimSun”更改为“Helvetica”,则不会出现错误。(显然输出中没有中文,因为该字体不包含这些字符。

我怀疑我错过了一些简单的东西,但我不知道它是什么。

我试图从我找到的示例中做到这一点(见下面的代码),但我没有看到他们打印中文并在源代码中有 utf-8 字符串的示例。

    #include <stdio.h>
    #include <setjmp.h>
    #include "hpdf.h"

    jmp_buf env;

    void error_handler (HPDF_STATUS   error_no,
                   HPDF_STATUS   detail_no,
                   void         *user_data)
    {
        printf ("ERROR: error_no=%04X, detail_no=%u\n", (HPDF_UINT)error_no, (HPDF_UINT)detail_no);
        longjmp(env, 1);
    }

    int main (int argc, char **argv)
    {
        HPDF_Doc 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_UseUTFEncodings(pdf);
        HPDF_SetCurrentEncoder(pdf, "UTF-8");
        HPDF_UseCNSFonts (pdf);
        HPDF_Page page = HPDF_AddPage (pdf);

        HPDF_REAL height = HPDF_Page_GetHeight (page);
        HPDF_REAL width = HPDF_Page_GetWidth (page);

        HPDF_Font def_font = HPDF_GetFont (pdf, "SimSun", NULL);
        //HPDF_Font def_font = HPDF_GetFont (pdf, "Helvetica", NULL);
        HPDF_Page_SetFontAndSize (page, def_font, 24);

        //const char* text = "Hello World!";
        const char* text = "Hello: 警告:温度控制已禁用。";
        HPDF_REAL tw = HPDF_Page_TextWidth (page, text);
        HPDF_Page_BeginText (page);
        HPDF_Page_TextOut (page, (width - tw) / 2, height - 50, text);
        HPDF_Page_EndText (page);

        HPDF_SaveToFile (pdf, "a.out.pdf");
        HPDF_Free (pdf);

        return 0;
    }

C pdf UTF-8 libharu

评论

1赞 Fareanor 9/27/2023
不知道那个库,但是,你有没有看过什么是错误 1028 ?也许它会回答你。
0赞 Eljay 9/27/2023
对于 ,在其处理块中访问的任何变量都应标记为 。否则,由于 setjmp/longjmp 是 C 或 C++ 中唯一的非结构化编程结构(或诉诸汇编;并且作为记录,C 和 C++ 以及 C++ 都符合结构化编程),编译器需要知道变量实际上是(由于 setjmp/longjmp 可能会从编译器对事物的跟踪下拉出地毯)。setjmpvolatilegotothrowpdfvolatile

答: 暂无答案