从URL创建字体

时间:2018-09-04 18:40:07

标签: c# fonts aws-lambda itext

是否有可能从URI创建字体?像这样:

// c# code
string fontUri = "https://www.manyfonts.com/VAGRoundedStd-Thin.ttf";
BaseFont myfont = BaseFont.CreateFont(fontUri, BaseFont.CP1252, BaseFont.EMBEDDED);

// or

Font font = FontFactory.GetFont(fontUri, BaseFont.CP1252,false, 9);

我也尝试过用二进制

public static Font GetFont()
{

  string fontUri = Config.FONT_URI;
  Console.WriteLine(fontUri);
  byte[] fontBinary = new WebClient().DownloadData(fontUri);
  BaseFont bf = BaseFont.CreateFont(
    "VAGRoundedStd-Thin.ttf",
    BaseFont.WINANSI,
    BaseFont.EMBEDDED,
    false,
    fontBinary,
    null
  );

  return new Font(bf, 12, Font.NORMAL, Colors.PINK);
}

现在我得到了:

Unhandled Exception: System.NotSupportedException: No data is available for encoding 1252. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.
   at System.Text.Encoding.GetEncoding(Int32 codepage)
   at iTextSharp.text.pdf.TrueTypeFont.ReadStandardString(Int32 length)
   at iTextSharp.text.pdf.TrueTypeFont.Process(Byte[] ttfAfm, Boolean preload)
   at iTextSharp.text.pdf.TrueTypeFont..ctor(String ttFile, String enc, Boolean emb, Byte[] ttfAfm, Boolean justNames, Boolean forceRead)

我的代码在lambda函数中,无法访问文件系统。也许将ttf加载到内存中,然后以某种方式在iTextSharp中加载?任何解决方法都欢迎。

1 个答案:

答案 0 :(得分:0)

我要问自己。感谢@UweKeim @mkl @bruno的帮助。

如果您在not supported exception上遇到问题(可能是因为您使用的是Mac或Linux),请将此引用添加到您的.csproj

<PackageReference Include="System.Text.Encoding.CodePages" />

这是一个通过添加到单元格文本的URL有效创建字体的代码段示例。

using System;
using System.Net;

using iTextSharp.text;
using iTextSharp.text.pdf;

namespace MyNameSpace
{
  class Foo
  {
    public static PdfPCell CreateCellWithFontFromUrl()
    {

      // Necesary ONLY if you're getting the error `not supported encoding`
      System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

      string fontUri ="http://www.fonts.com/yourfontname.ttf";
      byte[] fontBinary = new WebClient().DownloadData(fontUri);

      BaseFont bf = BaseFont.CreateFont(
        "VAGRoundedStd-Thin.ttf", // Is important you add ".ttf" at the end of the font name
        BaseFont.WINANSI,
        BaseFont.EMBEDDED,
        false, // NO CACHE
        fontBinary,
        null
      );

      return bf;
    };

    Font MY_FONT = new Font(bf, 20, Font.BOLD, new Color(29, 29, 29));
    PdfPCell cell = new PdfPCell(new Paragraph("text of the paragraph", MY_FONT));

    return cell;
  }
}