无法用itext获取文本的真实字体?

时间:2014-11-07 14:16:25

标签: itext text-extraction pdf-extraction

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

Getting Text fonts from a pdf file using iText

但是,当我手动检查时,它似乎为所有单词提供相同的字体类型(复制粘贴到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

...

1 个答案:

答案 0 :(得分: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());

您在BaseFont.java中找到了方法getFullFontName的描述:

/** 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()方法。