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

时间:2019-07-12 14:15:35

标签: c# pdf fonts pdfium

我正在尝试向PDF文档中添加自定义字体(otf文件或用于测试目的ttf)以呈现文本页面对象。呈现的文本始终像ÿÿÿÿÿÿ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将字体加载到文档中。下面的代码片段可以正常运行(因此fontpath是正确的,可以加载并且可以创建文本对象)。

我用https://github.com/bblanchon/pdfium-binaries中的最新文件交换了pdfium.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(some spaces) e(尽管您当然看不到空格)或为空。我的预期结果是Hello Snape。转换是可以的,因为在所需位置显示了错误的文本。

编辑:
更新包装程序后,使FPDFPageObj_CreateTextObjFPDF_FONT而不是字体名称作为字符串,将以正确的字体显示文本。仍然是乱码。(更新代码)

1 个答案:

答案 0 :(得分:1)

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