Как узнать ширину лигатуры с помощью iText - PullRequest
0 голосов
/ 24 октября 2018

Как узнать ширину лигатуры?Предположим, у меня есть лигатура, могу ли я получить ее точную ширину?Когда я делаю это:

doc.setProperty(Property.TYPOGRAPHY_CONFIG, new TypographyConfigurator()
        .addFeatureConfig(
            new StandardScriptConfig(new HashSet<Character.UnicodeScript>(Arrays.asList(Character.UnicodeScript.LATIN, Character.UnicodeScript.CYRILLIC)))
                    .setLigaturesApplying(true)
        ));
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.IDENTITY_H, true);
font.getWidth("ff", 13);

Это дает обычную ширину FF

1 Ответ

0 голосов
/ 31 октября 2018

Получение ширины лигатуры "ff", в частности

Рассматриваемая лигатура имеет свой собственный назначенный символ Unicode U+FB00, поэтому для ее получения можно использовать.

font.getWidth("\uFB00", 12);

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

Указывая Property.TYPOGRAPHY_CONFIG, вы неявно используете модуль pdfCalligraph, который отвечает за применение каллиграфических функций, таких как лигатуры.Это надстройка с закрытым исходным кодом, которая не имеет общедоступного API для взаимодействия и предназначена для плавной интеграции в существующий код.

Для эффективного использования (как это будет отображаться в результирующем PDF)любого элемента макета вы можете вручную создать макет такого элемента, а затем получить некоторые свойства результата макета, такие как вычисленная ширина.

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

float calculateTextWidth(Document document, String text) throws IOException {
    PdfFont font = PdfFontFactory.createFont(fontPath, PdfEncodings.IDENTITY_H, true);
    Paragraph p = new Paragraph(text).setFont(font);
    IRenderer paragraphRenderer = p.createRendererSubTree();
    paragraphRenderer.setParent(document.getRenderer()).layout(new LayoutContext(new LayoutArea(1, new Rectangle(100, 100))));
    return paragraphRenderer.getChildRenderers().get(0).getOccupiedArea().getBBox().getWidth();
}

Убедитесь, что прямоугольник, который вы передаете конструктору LayoutArea, достаточно велик, чтобы вместить весь текст (в нашем случае 100x100 более чем достаточно).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...