如何使用 PDFiumSharp 将字体加载到 PDF 文档中?
How can fonts be loaded into a PDF document with PDFiumSharp?
我正在尝试将自定义字体(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
将字体加载到文档中。下面的代码片段运行没有问题(所以字体路径是正确的,可以加载并且可以创建文本对象)。
我用 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_CreateTextObj
采用 FPDF_FONT
而不是字体名称作为字符串,文本以正确的字体显示。仍然是乱码。(更新代码)
好的,问题又出现在包装器中:
函数 bool FPDFText_SetText(FPDF_PAGEOBJECT text_object, [MarshalAs(UnmanagedType.LPStr)] string text)
需要一个 LPStr
。将其更改为 LPWStr
就可以了。
我正在尝试将自定义字体(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
将字体加载到文档中。下面的代码片段运行没有问题(所以字体路径是正确的,可以加载并且可以创建文本对象)。
我用 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_CreateTextObj
采用 FPDF_FONT
而不是字体名称作为字符串,文本以正确的字体显示。仍然是乱码。(更新代码)
好的,问题又出现在包装器中:
函数 bool FPDFText_SetText(FPDF_PAGEOBJECT text_object, [MarshalAs(UnmanagedType.LPStr)] string text)
需要一个 LPStr
。将其更改为 LPWStr
就可以了。