Как получить путь к шрифту в папке «Ресурсы» - PullRequest
0 голосов
/ 02 января 2019

Я создаю PDF-документ с использованием itextsharp, и мне нужно подключить шрифты из папки Assets. На данный момент все работает, когда я закидываю шрифты в память смартфона.

System.String ttf = Android.OS.Environment.ExternalStorageDirectory + 
"/arial.ttf";
var baseFont = BaseFont.CreateFont(tttt, BaseFont.IDENTITY_H, 
BaseFont.NOT_EMBEDDED);
var font = new Font(baseFont, Font.DEFAULTSIZE, Font.NORMAL);

doc.Add(new Paragraph(inf1, font));

Но, наверное, ни у кого нет этих шрифтов в памяти смартфона:)

Я попытался получить путь к папке «Ресурсы», используя следующий код:

public static AssetManager Assets { get; private set; }

string ttf;
using (var asset = Assets.Open("arial.ttf"))
{
    var fontStream = new MemoryStream();
    asset.CopyTo(fontStream);
}

или другой вариант:

string content;
using (StreamReader sr = new StreamReader(Assets.Open("arial.ttf")))
{
    content = sr.ReadToEnd();
}

но в этих случаях возникает проблема: В экземпляре объекта не задана ссылка на объект... на линии

using (var asset = Assets.Open("arial.ttf")) 

и

using (StreamReader sr = new StreamReader(Assets.Open("arial.ttf")))

Может быть, есть какой-нибудь аналог пути к папке, похожий на путь к шрифту в Windows?

Environment.GetFolderPath(Environment.SpecialFolder.Fonts);

или, может быть, я могу каким-то образом использовать полученный TypeFace

Android.Graphics.Typeface tf = Android.Graphics.Typeface.CreateFromAsset(Application.Context.Assets, "arial.ttf"); 

Подскажите, пожалуйста, как мне установить необходимые шрифты в документе PDF или как найти путь к шрифту ttf, который будет вставлен в строку BaseFont:)

Ответы [ 2 ]

0 голосов
/ 25 мая 2019

Думаю, проблема в том, что BaseFont.CreateFont () хочет получить путь к файлу шрифта, а не к потоку.

Я также столкнулся с этой проблемой.Это работает для SDCard, но как заставить его читать из папки активов, я не знаю.В качестве обходного пути я копирую его в папку документов.

0 голосов
/ 03 января 2019

Проблема с приведенным выше кодом в моем понимании, когда вы говорите, что он дает вам ошибку object reference not set to an instance of an object., что означает, что вы не присваиваете ему значение и его ноль, то, что вам нужно сделать, чтобы преодолеть это просто;

После объявления имущества

 public AssetManager AppAssets { get; private set; }

В конструкторе вашего класса присвойте ему значение:

AppAssets= this.ApplicationContext.Assets; // In an activity
AppAssets= this.Activity.ApplicationContext.Assets; // In a fragment

Как только вы сделаете это, ошибка ссылки на объект должна исчезнуть,

Goodluck возвращается в случае запросов.

...