我使用itext将pdf转换为文本文件, 它实际上很好用但是对某些词来说它做了以下事情: 例如在pdf中,有一个短语,如"提出主要观点"但是itext创建了一个类似的输出 " presentthemainideas&#34 ;.反正有没有纠正这种行为?
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 <= reader.getNumberOfPages(); i++) {
strategy = parser.processContent(i, new SimpleTextExtractionStrategy());
text.append(strategy.getResultantText());
}
resultText=text.toString();
resultText = resultText.replaceAll("-\n", "");
out.println("-->"+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();
}
}
答案 0 :(得分:7)
此类空格字符丢失的原因是您在渲染的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示例,我们可能会提供一些帮助。
答案 1 :(得分:1)
您可以使用jasper报告。它就像一个魅力
答案 2 :(得分:1)
为了扩展mkl的精彩解释,下面是问题中提出的问题的特定变体的详细信息。我偶然发现了一个文档,我想从中提取文本。每个字母都是由一个空格分开的。
text would read as "t e x t"
我尝试实现我自己的提取策略类,如mkl所述。无论我试图应用于&#34;单一空间宽度&#34;价值,文本以与以前相同的方式出现。所以我调试了我的代码以查看宽度值本身,结果是 0 。
规避您可以在mkl概述的代码中使用修订值:
float spacing = lastEnd.subtract(start).length();
if (spacing > someFixValue)
{
result.append(' ');
}
如果您将自己的提取策略建立在 LocationTextExtractionStrategy 上,您要覆盖的方法是: IsChunkAtWordBoundary(...)