我有一些代码使用PDFSharp将使用私有字体的文本添加到PDF文件中。如果字体位于本地文件系统上,但是当我向其提供存储在Azure博客存储上的字体的URL时不起作用,则此方法成功。我也尝试在他们的CDN上使用谷歌字体,这也没有用。从网址加载字体有问题吗?
示例代码如下。请注意,我已经解决了Azure blob存储上的CORS issue,所以它不是。
private readonly XPdfFontOptions _fontOptions =
new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always);
private static readonly XPrivateFontCollection PrivateFontCollection =
XPrivateFontCollection.Global;
[Test]
public async Task Test01RawPdfSharp()
{
//SETUP
var account = "labelapptest";
var fs = new FileStore(account);
var fontUrl =
"http://labelapptest.blob.core.windows.net/designernospamcom/justyna sokolowska - erazm-regular.otf";
var pdfUrl =
"https://labelapptest.blob.core.windows.net/label-highrez-blank/blank-label00001.pdf";
var fontFamily = "Erazm Regular";
var localFontPath = Path.Combine(TestFileHelpers.GetTestDataFileDirectory(@"\TestFonts"),
"Justyna Sokolowska - Erazm-Regular.otf");
//ATTEMPT
var sFontFamilyname = "./#" + fontFamily;
var uri = new Uri(fontUrl);
PrivateFontCollection.Add(uri, sFontFamilyname);
var readDirStatus = await fs.GetDirHandleAsync(FileStorageTypes.LabelHighRezBlank);
using (var readStream = new MemoryStream())
{
await readDirStatus.Result.ReadFileAsync(readStream, pdfUrl);
readStream.Seek(0, SeekOrigin.Begin);
var document = PdfReader.Open(readStream);
var gfx = XGraphics.FromPdfPage(document.Pages[0]);
var font = new XFont(fontFamily, new XUnit(12, XGraphicsUnit.Point), XFontStyle.Regular, _fontOptions);
var brush = new XSolidBrush(XColor.FromKnownColor(XKnownColor.Red));
gfx.DrawString("Hello world", font, brush, 10, 10);
}
//VERIFY
}
在上面的示例中,如果我使用uri中的fontUrl
添加字体,则代码将在创建XFont的行中失败(从底部开始的第6个)。另一方面,如果我使用localFontPath
,那么它就可以了。
错误是:Cannot get a matching glyph typeface for font 'Erazm Regular'
位于XFont.cs中的PdfSharp.Drawing.XFont.Initialize()第23行:
注意:我已经下载并编辑了1.32 PDFSharp代码,以替换Debugger.Break
语句,此时有例外。 NuGet版本有Debugger.Break
导致已发布代码挂起 - 有关该问题,请参阅my SO question。
最后我换成了PDFsharp WPF 1.50 beta,因为它的字体处理要好得多,而且我无法通过http链接加载字体。似乎工作得很好。
答案 0 :(得分:2)
对PrivateFontCollection.Add(uri, sFontFamilyname)
的调用只是将URI传递给new System.Windows.Media.FontFamily(baseUri, familyName)
。我不知道Media.FontFamily是否可以处理Azure存储的URI。
我们将PrivateFontCollection与资源中的字体一起使用 - 从资源中加载字体是FontFamily Constructor (Uri, String)
帮助中给出的唯一示例。这是已知可与PDFsharp一起使用的URI类型。
FontFamily Constructor (Uri, String)
的语法有点神秘,最小的错误会导致“找不到”。