Не можете получить настоящие шрифты текстов с помощью itext?

Я пытался извлечь текст из pdf, и благодаря itext я могу извлечь весь текст. Однако я пытаюсь обнаружить шрифты заголовков и, используя эту информацию, планирую извлечь только те тексты между двумя конкретными заголовками. Например, в научной статье я хочу выделить только «вводную» часть. Для этого я перешел по следующей ссылке.

Получение текстовых шрифтов из файла PDF с помощью iText

Тем не менее, похоже, что для всех слов используется один и тот же тип шрифта, что неверно, когда я проверяю его вручную (копирование и вставка в текстовый документ позволяет мне видеть разные шрифты). Вот код, который я написал.

PdfReader reader = new PdfReader(pdf);
PrintWriter out = new PrintWriter(new OutputStreamWriter(new FileOutputStream(txt), "UTF-8"));
SemTextExtractionStrategy semTextExtractionStrategy = new SemTextExtractionStrategy();

for (int j = 1; j <= reader.getNumberOfPages(); j++) {
out.println(PdfTextExtractor.getTextFromPage(reader, j, semTextExtractionStrategy));}

        out.flush();
        out.close();

И класс, который я создаю для стратегии извлечения.

       public class SemTextExtractionStrategy implements TextExtractionStrategy {

private String text;

@Override
public void beginTextBlock() {
}

@Override
public void renderText(TextRenderInfo renderInfo) {
    text = renderInfo.getText();

    System.out.println(renderInfo.getFont().getFontType());
    System.out.println(renderInfo.getFont().getFullFontName());
    System.out.println(text);
}

@Override
public void endTextBlock() {
}

@Override
public void renderImage(ImageRenderInfo renderInfo) {
}

@Override
public String getResultantText() {
    return text;
}
}



public static void main(String args[])  {

trial credentials = new trial();
}}

В результате этого кода я получаю такие результаты. Все они имеют тип шрифта 4.

...
4                             --> font type
[[Ljava.lang.String;@4371767c --> font getFullFontName() ---> it must be HelveticaNeue-Bold
INTRODUCTION                  --> original text

4
[[Ljava.lang.String;@4e19e97b --> it must be AGaramond-Regular
We

4
[[Ljava.lang.String;@72fb24c  --> it must be AGaramond-Regular
have

...


person mlee_jordan    schedule 07.11.2014    source источник


Ответы (1)


Когда вы лучше узнаете Java, вы узнаете, что результаты, подобные вашему

[[Ljava.lang.String;@4371767c --> font getFullFontName() ---> it must be HelveticaNeue-Bold
[[Ljava.lang.String;@4e19e97b --> it must be AGaramond-Regular
[[Ljava.lang.String;@72fb24c  --> it must be AGaramond-Regular

являются типичными строковыми представлениями массивов массивов строк.

Таким образом, для вашей проверки значений вы должны начать с итерации по массиву, возвращаемому font getFullFontName(); поскольку каждая запись снова является массивом, вы также должны перебирать их; записи в нем являются строками и, следовательно, элементами, которые вы хотите распечатать.

Если вы хотите знать, что содержит этот массив массивов String, вы также научитесь ценить преимущества просмотра кода или хотя бы JavaDocs сторонних библиотек; в случае вашей линии

System.out.println(renderInfo.getFont().getFullFontName());

вы найдете это описание метода getFullFontName в BaseFont.java:

/** Gets the full name of the font. If it is a True Type font
 * each array element will have {Platform ID, Platform Encoding ID,
 * Language ID, font name}. The interpretation of this values can be
 * found in the Open Type specification, chapter 2, in the 'name' table.<br>
 * For the other fonts the array has a single element with {"", "", "",
 * font name}.
 * @return the full name of the font
 */
public abstract String[][] getFullFontName();

Взгляните на пример FontFactoryExample, чтобы получить представление об информации, хранящейся в этом двумерный массив: font_factory.pdf

Вместо этого вы можете использовать метод getPostscriptFontName().

person mkl    schedule 07.11.2014
comment
Спасибо @mkl. При итерации массивов я обращаюсь к именам. Однако на этот раз я точно так же хочу получить размер шрифта для каждого текста. Я вижу размер шрифта при отладке скрипта в gs. Но когда я пытаюсь добраться до него через renderInfo, я не могу это сделать? - person mlee_jordan; 07.11.2014
comment
Боюсь, размер шрифта официально недоступен. Однако, используя отражение, вы можете получить к нему доступ через этот член gs. - person mkl; 07.11.2014
comment
применив это решение stackoverflow.com/questions/10879336/… кажется, мне удалось получить размер шрифта для каждого текста. Однако я заметил, что даже в одной и той же текстовой части (например, вводной части статьи) размеры шрифта нестабильны. возможно ли это в формате pdf или решение, которое я использую, может быть неправильным? Заранее спасибо. @mkl - person mlee_jordan; 10.11.2014
comment
размеры шрифта нестабильны - это потому, что решение, на которое вы ссылаетесь, фактически возвращает подъем, ни размер шрифта. - person mkl; 11.11.2014