Can';我得不到文本';使用itext的真实字体?

Can';我得不到文本';使用itext的真实字体?,itext,text-extraction,pdf-extraction,Itext,Text Extraction,Pdf Extraction,我一直在尝试从pdf中提取文本,多亏了itext,我可以提取整个文本。然而,我试图检测标题的字体,通过使用这些信息,我计划只提取两个特定标题之间的文本。例如,在一篇科学论文中,我只想摘录“引言”部分。为此,我应用了以下链接 但是,当我手动检查时,它似乎为所有不正确的单词提供了相同的字体类型(复制粘贴到word文档使我能够看到不同的字体)。这是我写的代码 PdfReader reader = new PdfReader(pdf); PrintWriter out = new PrintWrite

我一直在尝试从pdf中提取文本,多亏了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();
作为这段代码的结果,我得到了这样的结果。它们都有字体类型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

当您更好地了解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()
返回的数组;因为每个条目都是一个数组,所以您也应该对它们进行迭代;其中的条目是字符串,因此是要打印的元素

如果您想知道这个字符串数组包含什么,您还将了解查看第三方库的代码或至少JavaDocs的好处;以防你的线路

System.out.println(renderInfo.getFont().getFullFontName());
您可以在以下内容中找到对方法的描述
getFullFontName

/**获取字体的全名。如果是真字型字体
*每个数组元素将具有{平台ID,平台编码ID,
*语言ID,字体名称}。该值的解释可以是
*可在开放式类型规范第2章的“名称”表中找到。
*对于其他字体,数组有一个带有{“”、“”、, *字体名称}。 *@返回字体的全名 */ 公共抽象字符串[][]getFullFontName();
看一看这个示例,了解存储在这个二维数组中的信息:


您可能想改用
getPostscriptFontName()
方法。

谢谢@mkl。迭代数组时,我访问名称。然而,这一次我同样要检索每个文本的字体大小。在“gs”下调试脚本时,我可以看到字体大小。但是,当我试图通过“renderInfo”访问它时,我无法访问它?恐怕字体大小还没有正式提供。通过使用反射,您可以通过gs成员访问它。通过应用此解决方案stackoverflow.com/questions/10879336/…似乎我成功地获得了每个文本的字体大小。然而,我观察到,即使在同一个文本部分(例如文章的引言部分),字体大小也不稳定。是否可能是pdf格式,或者我使用的解决方案可能是错误的?提前谢谢@mklfont大小不稳定-这是因为实际返回的是上升,也不是字体大小。
System.out.println(renderInfo.getFont().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();