itext java pdf to text creation

我使用一个itext将pdf转换为文本文件,它实际上很好用但是对于某些单词它做了以下事情:例如在pdf中有一个短语,如“呈现主要想法”但是itext创建一个输出,如“presentthemainideas”。 反正有没有纠正这种行为?

String pdf="/home/can/Downloads/NLP/textSummarization/A New Approach for Multi-Document Update Summarization.pdf"; String txt="/home/can/myWorkSpace/PDFConverterProject/outputs/bb.txt"; StringBuffer text=new StringBuffer() ; String resultText=""; PdfReader reader; try { reader = new PdfReader(pdf); PdfReaderContentParser parser = new PdfReaderContentParser(reader); PrintWriter out = new PrintWriter(new FileOutputStream(txt)); TextExtractionStrategy strategy; for (int i = 1; i "+resultText); StringTokenizer stringTokenizer=new StringTokenizer(resultText, "\n"); PrintWriter lineWriter = new PrintWriter(new FileOutputStream("/home/can/myWorkSpace/PDFConverterProject/outputs/line.txt")); while (stringTokenizer.hasMoreTokens()){ String curToken = stringTokenizer.nextToken(); lineWriter.println("line-->"+curToken); } lineWriter.flush(); lineWriter.close(); out.flush(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

这种空格字符丢失的原因是您在渲染的PDF中看到的空间不一定与PDF的页面内容描述中的空格字符相对应。 相反,您经常在PDF中找到一个操作,在渲染一个单词后,将当前位置稍微向右移动,然后再渲染下一个单词。

不幸的是,相同的机制也被用于增强相邻字形的外观:在一些字母组​​合中,为了获得良好的外观和阅读体验,字形应该彼此更接近地打印或者彼此之间的距离比默认情况下更远。 这是使用与上面相同的操作在PDF中完成的。

因此,在这种情况下,PDF解析器必须使用启发式方法来确定这种转换是否意味着暗示空间字符,或者它是否仅仅意味着使字母组看起来很好。 启发式可能会失败。

您使用SimpleTextExtractionStrategy作为文本提取策略。 这种情况下的启发式实现如下(当前在iText SVN中继的SimpleTextExtractionStrategy.java中的renderText方法中):

 float spacing = lastEnd.subtract(start).length(); if (spacing > renderInfo.getSingleSpaceWidth()/2f) { result.append(' '); } 

因此,至少是空间字符的当前宽度的一半宽的间隙被转换为空格字符。

这通常听起来很明智。 但是,对于仅使用水平移位来分隔单词的文档,实际空格字符的当前宽度可能不是启发式的好方法。

因此,您可以做的是尝试改进文本提取策略中的启发式方法。 复制现有的,操作它,并在您的代码中使用它。

如果您为您的问题提供示例PDF,我们可能会提供一些帮助。

你可以使用jasper报告。 它就像一个魅力

为了扩展mkl的精彩解释,下面是问题中提出的问题的特定变体的详细信息。 我偶然发现了一个文档,我想从中提取文本。 每一封信都是由一个空间分隔出来的。

 text would read as "text" 

我尝试实现我自己的提取策略类,如mkl所述。 无论我试图应用于“单一空间宽度”值的哪个因素,文本都以与以前相同的方式出现。 所以我调试了我的代码以查看宽度值本身,结果是0

为了规避你可以在mkl概述的代码中使用修复值:

 float spacing = lastEnd.subtract(start).length(); if (spacing > someFixValue) { result.append(' '); } 

如果您将自己的提取策略基于LocationTextExtractionStrategy则要覆盖的方法是: IsChunkAtWordBoundary(…)