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

如何使用libharu库将中文文本转换为PDF文件

使用libharu库实现中文文本转PDF

要实现中文文本转PDF,libharu的核心是处理中文字体和编码支持,以下是完整的C++实现代码及关键环节说明:

完整实现代码

bool textConvertToPDF(std::vector<std::string> text, std::string filePath)
{
    HPDF_Doc pdf = HPDF_New(nullptr, nullptr);
    if (!pdf) {
        // throw std::runtime_error("Failed to create PDF document");
        return true;
    }
    std::vector<std::string> lines = text;
    // lines.push_back(text);
    try {
        // 添加一个页面
        HPDF_Page page = HPDF_AddPage(pdf);
        HPDF_UseCNSFonts(pdf);
        HPDF_UseCNSEncodings(pdf);
        HPDF_SetCompressionMode(pdf, HPDF_COMP_ALL);
        // 设置页面尺寸(A4)
        HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);
        HPDF_SetCurrentEncoder(pdf, "UTF-8");
        // 加载本地中文字体文件(需替换为实际可用的字体路径)
        HPDF_Font font = HPDF_GetFont(pdf, HPDF_LoadTTFontFromFile(pdf, "/storage/emulated/0/Android/data/com.meitu.MTIKDemo/files/simsun.ttf", HPDF_TRUE), "UTF-8");
        HPDF_Page_SetFontAndSize(page, font, 12);
        // 设置起始位置
        float x = 50; // 左边距
        float y = HPDF_Page_GetHeight(page) - 50; // 顶部边距
        float line_height = 14; // 每行文本的高度(包含行间距)
        // 绘制每一行文本
        HPDF_Page_BeginText(page);
        for (const auto& line : lines) {
            HPDF_Page_TextOut(page, x, y, line.c_str());
            y -= line_height; // 移动到下一行
            if (y < 50) { // 如果超出页面底部,创建新页面
                HPDF_Page_EndText(page);
                page = HPDF_AddPage(pdf);
                HPDF_Page_SetSize(page, HPDF_PAGE_SIZE_A4, HPDF_PAGE_PORTRAIT);
                HPDF_Page_SetFontAndSize(page, font, 12);
                y = HPDF_Page_GetHeight(page) - 50;
                HPDF_Page_BeginText(page);
            }
        }
        HPDF_Page_EndText(page);
        // 保存 PDF 文件
        HPDF_SaveToFile(pdf, filePath.c_str());
    } catch (...) {
        HPDF_Free(pdf);
        // throw;
        return false;
    }
    HPDF_Free(pdf);
    return true;
}

关键环节说明

  • 文档资源管理:用HPDF_New初始化PDF文档,无论执行成功或失败,都必须调用HPDF_Free释放资源,避免内存泄漏。
  • 中文支持配置:
    • HPDF_UseCNSFonts和HPDF_UseCNSEncodings启用libharu的中文基础支持组件;
    • HPDF_SetCurrentEncoder(pdf, "UTF-8")设置文档编码为UTF-8,确保中文文本能被正确解析。
  • 本地字体加载:libharu默认中文字体覆盖有限,必须加载本地TTF字体(如宋体simsun.ttf)。通过HPDF_LoadTTFontFromFile加载字体文件,再用HPDF_GetFont关联UTF-8编码,注意替换代码中的字体路径为实际存在的有效路径。
  • 页面与文本布局:设置A4竖版页面,定义边距和行高,逐行绘制文本;当文本超出页面底部时,自动创建新页面并延续绘制逻辑。
  • 异常处理:用try-catch块捕获异常,确保出错时能及时释放PDF资源,避免资源泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 23:58:20