我一直尝试从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
...
答案 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()
方法。