Создать шрифт из URL - PullRequest
       12

Создать шрифт из URL

0 голосов
/ 04 сентября 2018

Есть ли возможность создать шрифт из 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)

Мой код находится в лямбда-функции и не может получить доступ к файловой системе. Может быть, загрузка TTF в память, а затем как-то в iTextSharp? Любой обходной путь приветствуется.

1 Ответ

0 голосов
/ 15 сентября 2018

Я спрошу себя. Спасибо @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;
  }
}
...