You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用libharu将UTF-8中文写入PDF?error_no=1028报错排查

问题:libharu生成UTF-8中文PDF时触发1028错误

在Debian Linux下使用libharu生成含中文的PDF,源代码字符串为UTF-8编码,指定SimSun字体时出现错误:

ERROR: error_no=1028, detail_no=0

改用Helvetica字体无报错,但因该字体无中文字符,PDF无法显示中文。

问题代码

#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;
}

解决方案

错误码1028对应HPDF_FONT_NOT_FOUND,核心原因是libharu无法定位到SimSun字体文件,按以下步骤修复:

  • 直接加载本地字体文件
    libharu默认不包含SimSun字体,需通过HPDF_LoadTTFontFromFile加载系统中实际存在的字体文件,替换原代码中HPDF_GetFont的调用:

    // 示例:加载系统中的SimSun字体(路径需根据实际情况调整)
    HPDF_Font def_font = HPDF_LoadTTFontFromFile(pdf, "/usr/share/fonts/truetype/simsun/SimSun.ttc", HPDF_TRUE);
    if (!def_font) {
        fprintf(stderr, "Failed to load SimSun font\n");
        longjmp(env, 1);
    }
    

    若系统无SimSun,可改用自带中文字体,比如文泉驿微米黑:

    HPDF_Font def_font = HPDF_LoadTTFontFromFile(pdf, "/usr/share/fonts/truetype/wqy/wqy-microhei.ttc", HPDF_TRUE);
    
  • 确保编码设置顺序正确
    原代码中HPDF_UseUTFEncodings和HPDF_SetCurrentEncoder的调用顺序正确,需保持在加载字体之前执行。

  • 编译时正确链接库
    编译命令需链接libharu:

    gcc -o pdf_chinese your_code.c -lharu
    

内容的提问来源于stack exchange,提问作者Stefan Koch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 02:27:33