Nano Hash - криптовалюты, майнинг, программирование

Кириллические буквы не отображаются в PDF, созданном с помощью iText в Android

Я пытаюсь создать PDF-файл в своем приложении для Android. Я использую iText, и он генерирует PDF, но отображаются только буквы на английском языке. Я нашел пример кода для iText, работающего с юникодом. Я попробовал этот пример кода в простом java-приложении comsole, и он работал нормально. Это код:

* --> Copyright 2001 by Paulo Soares, Bruno Lowagie <--
public class Chap0903 {
   public static void main(String[] args) {
      System.out.println("Chapter 9 example 3: True Types (embedded)");
      Document document1 = new Document();

      try {
         PdfWriter.getInstance(document1,
           new FileOutputStream("c:\\Chap0903.pdf"));

         BaseFont bfComic = BaseFont.createFont("assets/fonts/comic.ttf",
           BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
         Font font1 = new Font(bfComic, 12);
         String text1 = "This is the quite popular True Type font 'Comic'.";
         String text2 = "Some greek characters: \u0393\u0394\u03b6";
         String text3 = "Some cyrillic characters: \u0418\u044f";

         document1.open();
         document1.add(new Paragraph(text1,font1));
         document1.add(new Paragraph(text2,font1));
         document1.add(new Paragraph(text3,font1)); 
         document1.close();
     }
     catch(DocumentException de) {
        document1.close();
        System.err.println(de.getMessage());
     }
     catch(IOException ioe) {
        document1.close();
        System.err.println(ioe.getMessage());
     }
  }
}

Когда я адаптировал этот код для активности Android, он перестал работать:

public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    String root = Environment.getExternalStorageDirectory().getAbsolutePath();
    Document document1 = new Document();

    try {
        PdfWriter.getInstance(document1,
          new FileOutputStream(root+"/Chap0903.pdf"));

        BaseFont bfComic = BaseFont.createFont("assets/fonts/comic.ttf",
          BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font1 = new Font(bfComic, 12);
        String text1 = "This is the quite popular True Type font 'Comic'.";
        String text2 = "Some greek characters: \u0393\u0394\u03b6";
        String text3 = "Some cyrillic characters: \u0418\u044f";

        document1.open();
        document1.add(new Paragraph(text1,font1));
        document1.add(new Paragraph(text2,font1));
        document1.add(new Paragraph(text3,font1)); 
        document1.close();

        Intent intent = new Intent();
        setResult(RESULT_OK, intent);       
    } 
    catch(DocumentException de) {
        document1.close();
        Intent intent = new Intent();
        setResult(RESULT_CANCELED, intent);        
        System.err.println(de.getMessage());
    }
    catch(IOException ioe) {
        document1.close();
        Intent intent = new Intent();
        setResult(RESULT_CANCELED, intent);
        System.err.println(ioe.getMessage());
        Task.mes(ioe.getMessage());
    } finally {}
}

Проблема не в расположении файла comic.ttf, потому что если я изменю путь на неправильный, я получу IOException. Проблема заключается не в создании самого PDF-файла, потому что, если я использую этот код без font1, он создает PDF-файл на SD-карте, но без символов Unicode:

document1.add(new Paragraph(text1));
document1.add(new Paragraph(text2));
document1.add(new Paragraph(text3)); 

В чем может быть проблема?


  • Что ж, я нашел решение. Правильный код: BaseFont bfComic = BaseFont.createFont(assets/fonts/comic.ttf, Cp1251, BaseFont.EMBEDDED); 15.08.2011
  • Если вы нашли решение, вы можете ответить на свой вопрос (вместо добавления его в качестве комментария). 17.08.2011
  • Работает ли он с любым из стандартных шрифтов? Я не нахожу assets/fonts/comic.ttf 22.09.2011

Ответы:


1

я использовал

BaseFont bfComic = BaseFont.createFont("/system/fonts/Comic.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

и это работает. Вы должны проверить каталог шрифтов на вашем Android-устройстве, чтобы убедиться.

Для китайских иероглифов я использовал

BaseFont bfSans = BaseFont.createFont("/system/fonts/DroidSansFallback.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

Убедитесь, что вы указали запасной шрифт в блоке catch(), например:

font = new Font(Font.FontFamily.HELVETICA, 24, Font.NORMAL, BaseColor.BLACK);

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

21.09.2011
  • В вашем проекте Comic.ttf и DroidSansFallback.ttf отмечены как AndroidAsset в BuildAction или как? 24.10.2019

  • 2

    Это также зависит от используемого вами шрифта. Если используемый вами шрифт не поддерживает буквы кириллицы, буквы кириллицы отображаться не будут. Например: Если вы используете шрифт google google_regular.ttf, то буквы кириллицы не будут отображаться в pdf-файле.

    21.05.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..