Что такое iText 7, эквивалент FontSelector.Process?

Я начинаю процесс обновления кода, написанного для iText5, для работы с iText7.

Есть ли в iText7 механизм, аналогичный классу FontSelector, где вы загружали бы шрифты, а действие «Обработка» автоматически определяло бы, какой шрифт использовать (и возвращало бы отформатированный «кусок» pdf, который можно было бы добавить в документ)? Вот фрагмент кода (это C ++, но мой «родной» язык - C #, поэтому не стесняйтесь отвечать на C #).

try {
    doc = gcnew Document();
    pdfWriter = PdfWriter::GetInstance(doc, pdfStream);

    FontSelector^ selector = gcnew FontSelector();
    selector->AddFont(gcnew Font(BaseFont::CreateFont("Fonts\\cour.ttf"), BaseFont::IDENTITY_H, BaseFont::NOT_EMBEDDED), 10.0f));
    selector->AddFont(gcnew Font(BaseFont::CreateFont("Fonts\\arialuni.ttf"), BaseFont::IDENTITY_H, BaseFont::NOT_EMBEDDED), 10.0f));

    doc->Open();
    while (textReader->EndOfStream == false)
    {
        String^ line = textReader->ReadLine();
        doc->Add(selector->Process(line + "\n"));
}

person Erik Johnson    schedule 14.03.2018    source источник


Ответы (1)


Аналогичный механизм действительно доступен в iText7. И есть даже способ заставить его работать неявно, не обрабатывая фрагменты и не добавляя их вручную в документ. Класс, который вы ищете, называется FontProvider. Для начала вам нужно создать экземпляр и добавить в него свои шрифты:

FontProvider provider = new FontProvider();
provider.AddFont(fontsFolder + "NotoSans-Regular.ttf");
provider.AddFont(fontsFolder + "FreeSans.ttf");
provider.GetFontSet().AddFont(fontsFolder + "Puritan2.otf", PdfEncodings.IDENTITY_H);

Затем вам понадобится экземпляр layout Document, который мог быть создан таким образом или любым другим способом:

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(outFileName));
Document doc = new Document(pdfDoc);

Затем все, что вам нужно, - это установить поставщик шрифта для документа и, что наиболее важно, установить предпочтительное имя шрифта для запуска механизма выбора шрифта. Если вы не выберете предпочтительное имя шрифта и не укажете PdfFont явно, будет использоваться шрифт по умолчанию, Helvetica.

Код для выполнения вышеуказанного может выглядеть следующим образом:

doc.SetFontProvider(provider);
doc.SetFont("NotoSans");
Paragraph paragraph = new Paragraph("Hello world! \u05E2\u05B4\u05D1\u05B0\u05E8\u05B4\u05D9\u05EA\u202C");
doc.Add(paragraph);

Наконец, не забудьте закрыть документ:

doc.Close();
person Alexey Subach    schedule 19.03.2018