Реализация PdfSharp IFontResolver приводит к сбою приложения .NET MAUI для AndroidAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Реализация PdfSharp IFontResolver приводит к сбою приложения .NET MAUI для Android

Сообщение Anonymous »

В приложении .NET MAUI 9 я использую PdfSharp.Maui (1.0.5) для создания PDF-документа. Я не использую PdfSharp.Maui напрямую, а использую PDFsharp, который является транзитивным пакетом:

Код: Выделить всё

using (PdfDocument document = new PdfDocument())
{
PdfPage page = document.AddPage();
...
XFont fontLabel = new XFont("OpenSans", 10, XFontStyleEx.Regular);
...
}
В этом коде я пытаюсь загрузить шрифт OpenSans. MAUI имеет два файла .ttf в качестве ресурсов MauiFont, но PdfSharp не может получить к ним прямой доступ, поэтому я реализовал IFontResolver, чтобы преобразовать их из встроенных ресурсов в файлы на диске, а затем сделать их доступными для XFont:

Код: Выделить всё

public class FileFontResolver : IFontResolver
{
public string DefaultFontName => throw new NotImplementedException();

public byte[] GetFont(string faceName)
{
// Extract embedded font and save to file if it doesn't exist
string fontPath = Path.Combine(FileSystem.AppDataDirectory, faceName);
if (!File.Exists(fontPath))
{
// Use embedded fonts localed at Resources/Fonts
using Stream fontStream = FileSystem.OpenAppPackageFileAsync(faceName).Result;
using FileStream outputStream = File.Create(fontPath);
fontStream.CopyTo(outputStream);
}

// Provide font byte array to XFont
using (var ms = new MemoryStream())
{
using (var fs = File.Open(fontPath, FileMode.Open))
{
fs.CopyTo(ms);
ms.Position = 0;
return ms.ToArray();
}
}
}

public FontResolverInfo? ResolveTypeface(string familyName, bool isBold, bool isItalic)
{
if (familyName.Equals("OpenSans", StringComparison.CurrentCultureIgnoreCase))
{
if (isBold)
{
return new FontResolverInfo("OpenSans-Semibold.ttf");
}
else
{
return new FontResolverInfo("OpenSans-Regular.ttf");
}
}
return null;
}
}
FileFontResolver зарегистрирован в Pdfsharp в MauiProgram.cs:

Код: Выделить всё

public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
...
GlobalFontSettings.FontResolver = new FileFontResolver();
}
}
Это работает при отладке как на эмуляторах, так и на физических устройствах, но когда приложение выпускается и распространяется в Google Play, это приводит к сбою приложения с исключением:

Код: Выделить всё

Exception android.runtime.JavaProxyThrowable:
at Microsoft.Maui.Storage.FileSystemImplementation.PlatformOpenAppPackageFile + 0x37 (Unknown Source)
at Microsoft.Maui.Storage.FileSystemImplementation.PlatformOpenAppPackageFileAsync + 0x0 (Unknown Source)
at Microsoft.Maui.Storage.FileSystemImplementation.OpenAppPackageFileAsync + 0x0 (Unknown Source)
at Microsoft.Maui.Storage.FileSystem.OpenAppPackageFileAsync + 0x5 (Unknown Source)
at VetExpertDiagnostics.SmartReader.PdfSharpClasses.FileFontResolver.GetFont + 0x14 (Unknown Source)
at PdfSharp.Fonts.FontFactory.ResolveTypeface + 0xde (Unknown Source)
at PdfSharp.Drawing.XGlyphTypeface.GetOrCreateFrom + 0x1c (Unknown Source)
at PdfSharp.Drawing.XFont.Initialize + 0x49 (Unknown Source)
at PdfSharp.Drawing.XFont..ctor + 0x2e (Unknown Source)
at PdfSharp.Drawing.XFont..ctor + 0xe (Unknown Source)
at VetExpertDiagnostics.SmartReader.ViewModelClasses.TestViewModel+d__49.MoveNext + 0xc2 (Unknown Source)
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw + 0x11 (Unknown Source)
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess + 0x3e (Unknown Source)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification + 0x2d (Unknown Source)
Второй пилот предложил избегать следующей строки кода:

Код: Выделить всё

using Stream fontStream = FileSystem.OpenAppPackageFileAsync(faceName).Result
и предложил использовать статический метод для предварительной загрузки шрифтов при запуске приложения, но это вызвало еще большую проблему (при выпуске и распространении приложение аварийно завершает работу при запуске.) (также представлено в качестве ответа ниже)
Я действительно не знаю, как решить эту проблему, и у меня закончились идеи.
Есть ли у кого-нибудь рабочее решение или мне следует начать искать альтернативы PdfSharp?>

Подробнее здесь: https://stackoverflow.com/questions/798 ... oid-to-cra
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»