【问题标题】:How can fonts be loaded into a PDF document with PDFiumSharp?如何使用 PDFiumSharp 将字体加载到 PDF 文档中?
【发布时间】:2019-11-22 07:55:39
【问题描述】:

我正在尝试将自定义字体(otf 文件或用于测试目的 ttf)添加到我的 PDF 文档以呈现文本页面对象。呈现的文本总是像ÿÿÿÿÿÿe 一样乱码('e' 可能是我的字符串的最后一个字符或随机字符)。创建、渲染和添加其他对象(如路径或图像)工作正常。所以我猜字体没有正确加载。

我正在使用 C# 包装器 PDFiumSharp (https://github.com/ArgusMagnus/PDFiumSharp) 的更新版本,它提供以下方法:FPDFText_LoadFont(document, FontType, IsCid, byte[] fontData)FPDFPageObj_CreateTextObj(document, FPDF_Font font, size)。 PDFiumSharp 的 wiki 声明通过LoadFont 将字体加载到文档中。下面的代码 sn -p 运行没有问题(所以 fontpath 是正确的,可以加载并且可以创建文本对象)。

我将 pdfium.dll 与来自https://github.com/bblanchon/pdfium-binaries 的最新版本进行了交换,其中也包括入口点 FPDF_LoadFont。

还有另一个入口点FPDF_InitLibraryWithConfig,它以FPDF_LIBRARY_CONFIG 作为参数。此配置包含一个只读字段IntPtr _userFontPaths,我可能会以某种方式使用它,但我还没有找到设置它的方法。

public void AddText(int pageIndex, string text, int posX, int posY, float scale, string fontPath)
{
    if (string.IsNullOrEmpty(fontPath)) return;

    // load default font, if not already loaded
    try
    {
        byte[] fontData = File.ReadAllBytes(fontPath);
        _font = PDFium.FPDFText_LoadFont(_document.Handle, FontTypes.TrueType, false, fontData);
    }
    catch (Exception e)
    {
        return;
    }

    FPDF_PAGEOBJECT obj = PDFium.FPDFPageObj_CreateTextObj(_document.Handle,
                                                           _font,
                                                            12.0f * scale);

    /* Matrix: | a, c, e| ==> | width, 0,      offsetX|
     *         | b, d, f|     | 0,     height, offsetY|*/
    PDFium.FPDFPageObj_Transform(obj, 1, 0, 0, 1, posX, posY);

    PDFium.FPDFText_SetText(obj, text);

    PDFium.FPDFPage_InsertObject(_document.Pages[pageIndex].Handle, ref obj);
}

调用它:

AddText(0, "Hello Snape", 10, 50, 1, @"C:\SomeFont.ttf");

在某些 PDF 查看器中的渲染结果是这样的:ÿÿÿÿÿÿÿÿe(some spaces) e(当然你看不到空格)或为空。我的预期结果是Hello Snape。转换没问题,因为错误的文本显示在想要的位置。

编辑:
更新包装器后,FPDFPageObj_CreateTextObjFPDF_FONT 代替字体名称作为字符串,文本以正确的字体显示。乱码仍然存在。(更新代码)

【问题讨论】:

    标签: c# pdf fonts pdfium


    【解决方案1】:

    好的,问题再次出现在包装器中: 函数bool FPDFText_SetText(FPDF_PAGEOBJECT text_object, [MarshalAs(UnmanagedType.LPStr)] string text) 需要一个LPStr。将其更改为 LPWStr 就可以了。

    【讨论】:

      猜你喜欢
      • 2011-01-15
      • 1970-01-01
      • 2016-11-19
      • 2015-11-23
      • 2016-12-21
      • 2022-07-11
      • 1970-01-01
      • 2022-08-03
      • 2013-04-04
      相关资源
      最近更新 更多