Информация о шрифте текста в PDF с использованием PDFBox

Я новичок в библиотеке Apache PDFBox.

Я хочу сопоставить информацию о шрифте с абзацами PDF

Я уже прошел через Questios Как сделать извлекать стили шрифтов из текстового содержимого с помощью pdfbox?

Но он не дает информации о том, какой абзац каким шрифтом написан.

например, если моя страница содержит текст:

пункт 1: Arial

пункт 2: Times New Roman

Тогда я смогу получить информацию о том, что para1 написан в Arial, а para2 написан в Times New Roman.

Решение, предложенное в приведенном выше вопросе, дает информацию о том, что страница PDF содержит только

Arial и Times New Roman.


person Gaurav Singh    schedule 21.11.2013    source источник
comment
обратитесь по этой ссылке. stackoverflow.com/questions/6939583/   -  person PKhode    schedule 21.11.2013
comment
@pappukhode я уже упоминал ссылку в моем вопросе   -  person Gaurav Singh    schedule 21.11.2013


Ответы (2)


Используемый вами класс PDFTextStripper задокументирован (см. Его комментарий JavaDoc) следующим образом:

* This class will take a pdf document and strip out all of the text and ignore the
* formatting and such.

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

Информация о шрифте доступна в этом классе все время и отбрасывается только при выводе строки, посмотрите на его source:

protected void writePage() throws IOException
{
    [...]
    for( int i = 0; i < charactersByArticle.size(); i++)
    {
        [...]
        List<TextPosition> line = new ArrayList<TextPosition>();
        [...]
        while( textIter.hasNext() )
        {
            [...]
            if( lastPosition != null )
            {
                [...]
                if(!overlap(positionY, positionHeight, maxYForLine, maxHeightForLine))
                {
                    writeLine(normalize(line,isRtlDominant,hasRtl),isRtlDominant);
                    line.clear();
                    [...]
                }
............

Экземпляры TextPosition в этом списке line по-прежнему имеют всю доступную информацию о форматировании, в том числе используемый шрифт, только при "нормализации" line он сокращается до чистых символов.

Следовательно, чтобы сохранить информацию о шрифте, у вас есть разные варианты, в зависимости от того, как вы хотите получить информацию о шрифте:

  • Если вы хотите продолжить получение всей информации о содержимом страницы (включая шрифты) в одной строке через getText: вы меняете метод

    private List<String> normalize(List<TextPosition> line, boolean isRtlDominant, boolean hasRtl)
    

    для включения некоторых тегов шрифтов (например, [Arial]) по вашему выбору при изменении шрифта. К сожалению, этот метод частный. Таким образом, вам нужно скопировать весь _ 10_ и измените код копии.

  • Если вы хотите получить конкретную информацию о шрифте в другой структуре (например, как List<List<TextPosition>>), вы можете получить свой собственный класс стриппера из _ 12_, добавьте переменную желаемого типа и переопределите protected метод writePage, упомянутый выше, скопировав его и только усиление прямо до или после строки

    writeLine(normalize(line,isRtlDominant,hasRtl),isRtlDominant);
    

    с кодом, добавляющим информацию в вашу новую переменную. Например.

    public class MyPDFTextStripper extends PDFTextStripper
    {
        public List<List<TextPosition>> myLines = new ArrayList<List<TextPosition>>();
        [...]
                    if(!overlap(positionY, positionHeight, maxYForLine, maxHeightForLine))
                    {
                        writeLine(normalize(line,isRtlDominant,hasRtl),isRtlDominant);
                        myLines.add(new ArrayList<TextPosition>(line));
                        line.clear();
                        [...]
                    }
    

    Теперь вы можете вызвать getText для экземпляра вашего MyPDFTextStripper, получить в качестве результата простой текст и получить доступ к дополнительным данным через новую переменную.

person mkl    schedule 21.11.2013

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

person KhAn SaAb    schedule 21.11.2013
comment
Я просто хочу знать, какой текст каким шрифтом написан, шрифты уже установлены на моем компьютере. - person Gaurav Singh; 21.11.2013