1

我一直在尝试从 pdf 中提取文本,并且由于 itext 我可以提取整个文本。但是,我正在尝试检测标题的字体,并且通过使用此信息,我计划仅提取两个特定标题之间的那些文本。例如,在一篇科学论文中,我只想提取“介绍”部分。为此,我申请了以下链接。

使用 iText 从 pdf 文件中获取文本字体

但是,它似乎为所有单词提供了相同的字体类型,当我手动检查时这是不正确的(将粘贴复制到 word 文档使我能够看到不同的字体)。这是我写的代码。

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

...

4

1 回答 1

2

当您更好地了解 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()方法。

于 2014-11-07T15:03:41.207 回答