Как можно добавить шрифт для PDF в библиотеке iText?

У меня есть проект, который вызывает метод сервера, подключенного через Dependency Injection (DI), из другого проекта в библиотеке классов. В папку Resources я загрузил шрифт Roboto-Regular.ttf и хочу использовать его для генерации PDF-файла с помощью iText. Я установил для файла свойства Build Action на Content и Copy to Output Directory на Copy if newer. Проект запускаю с использованием Docker Compose. Можете подсказать, правильно ли я подгружаю шрифт? Если нет, то каким образом это следует сделать? В данный момент возникает ошибка: <b>/app/Resources/Roboto-Regular.ttf not found as file or resource.</b> 

Вот немного кода из метода:

<pre><code class="cs">var document = new Document(pdf, pageSize);

var fontPath = Path.Combine(Directory.GetCurrentDirectory(), "Resources", "Roboto-Regular.ttf");
var font = PdfFontFactory.CreateFont(fontPath);
document.SetFont(font);</code></pre>
  • 21 ноября 2024 г. 10:03
Ответы на вопрос 1
Чтобы использовать шрифт в библиотеке iText с учетом особенностей Docker и вашего проекта, важно правильно определять путь к файлу. Вот основные шаги, которые помогут вам корректно подключить шрифт и устранить ошибку «not found as file or resource»:

1. **Убедитесь, что файл шрифта включён в сборку**:
   - Убедитесь, что файл `Roboto-Regular.ttf` действительно находится в папке `Resources` вашего проекта.
   - В настройках проекта для файла шрифта установите `Build Action` на `Content` и `Copy to Output Directory` на `Copy if newer`.

2. **Правильный путь к файлу**:
   В Docker файлы могут размещаться в другом каталоге, чем вы ожидаете. Вместо использования `Directory.GetCurrentDirectory()` лучше воспользоваться следующим подходом:

   ```csharp
   var fontPath = Path.Combine(AppContext.BaseDirectory, "Resources", "Roboto-Regular.ttf");
   ```

   `AppContext.BaseDirectory` указывает на базовый каталог приложения, что более надежный способ получения пути к файлам, особенно при работе внутри Docker.

3. **Проверка наличия файла**:
   Перед загрузкой шрифта вы можете добавить проверку, существует ли файл по указанному пути:

   ```csharp
   if (!File.Exists(fontPath))
   {
       throw new FileNotFoundException($"Font file not found: {fontPath}");
   }
   ```

4. **Альтернативный способ загрузки шрифтов**:
   Если проблема с путём присутствует, можно также рассмотреть загрузку шрифта из ресурсов (если приложение настроено на использование встроенных ресурсов):

   ```csharp
   using (var fontStream = typeof(YourClass).Assembly.GetManifestResourceStream("Namespace.Resources.Roboto-Regular.ttf"))
   {
       var font = PdfFontFactory.CreateFont(fontStream, PdfEncodings.IDENTITY_H, true);
       document.SetFont(font);
   }
   ```

   Убедитесь, что:
   - Вы добавили шрифт как встроенный ресурс в свойствах файла (Build Action: Embedded Resource).
   - Имя пространства имён и имя файла resource корректно указаны.

5. **Dockerfile**:
   Пожалуйста, проверьте, что в вашем Dockerfile копируются все необходимые файлы и директории, включая `Resources`.

После внесения этих изменений попробуйте снова запустить ваше приложение. Возможно, одна из предложенных стратегий поможет вам правильно загрузить шрифт для генерации PDF-файла с помощью iText.
Похожие вопросы