如何使用PDFiumSharp将字体加载到PDF文档中?

4
我正在尝试将自定义字体(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的维基说明通过LoadFont将字体加载到文档中。接下来的代码片段可以无误地运行(因此,字体路径是正确的,可以加载,并且文本对象可以创建)。
我用最新的pdfium.dll替换了https://github.com/bblanchon/pdfium-binaries中的dll,其中也包括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(一些空格) e(虽然您当然看不到空格),或者是空白的。我的期望结果是Hello Snape。转换是可以的,因为错误的文本被显示在了期望位置。
编辑:
更新包装器后,使FPDFPageObj_CreateTextObj使用FPDF_FONT而不是字体名称作为字符串,文本将以正确的字体显示。乱码仍然存在。(已更新代码)
1个回答

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接