我使用itext将pdf转换为文本文件,它实际上效果很好,但对于某些单词来说,它会做以下事情:例如,在pdf中有一个短语,比如"提出主要想法",但itext创建了一个输出,比如"presentatheminideas"。有没有办法纠正这种行为?
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();
}
}
之所以缺少空格字符,是因为您在渲染的PDF中看到的空格不一定与PDF页面内容描述中的空格字符相对应。相反,你经常会在PDF中发现一个操作,在呈现一个单词后,在呈现下一个单词之前,将当前位置稍微向右移动。
不幸的是,同样的机制也用于增强相邻字形的外观:在一些字母组合中,为了获得良好的外观和阅读体验,字形应该打印得比默认情况下更靠近或更远。这是在PDF中使用与上述相同的操作完成的。
因此,在这种情况下,PDF解析器必须使用启发式方法来决定这样的转换是意味着一个空格字符,还是仅仅是为了让字母组看起来好看。试探法可能会失败。
您使用SimpleTextExtractionStrategy
作为文本提取策略。这种情况下的启发式是这样实现的(就像目前iText 5.x github git开发分支中SimpleTextExtractionStrategy.java中的renderText
方法一样):
float spacing = lastEnd.subtract(start).length();
if (spacing > renderInfo.getSingleSpaceWidth()/2f)
{
result.append(' ');
}
因此,至少是作为空间字符的当前宽度的一半宽的间隙被转换为空间字符。
这听起来很合理。然而,对于只使用水平移动来分隔单词的文档,实际空格字符的当前宽度可能不是启发式的好衡量标准。
因此,您可以尝试改进文本提取策略中的启发式方法。复制现有的一个,操作它,并在代码中使用它。
如果你为你的问题提供一个PDF样本,我们可能会有一些想法来帮助你。
您可以使用jasper报告。它就像一个魅力
为了扩展mkl的精彩解释,以下是问题中提出的问题的具体变体的详细信息。我偶然发现了一份我想从中提取文本的文件。每封信都被一个空格隔开。
text would read as "t e x t"
我尝试实现mkl所概述的我自己的提取策略类。无论我试图将哪种因素应用于"单空格宽度"值,文本都与以前一样。因此,我调试了我的代码,以查看宽度值本身,结果是0。
为了避免这种情况,您可以在mkl:概述的代码中使用修复值
float spacing = lastEnd.subtract(start).length();
if (spacing > someFixValue)
{
result.append(' ');
}
如果您自己的提取策略基于LocationTextExtractionStrategy,则要覆盖的方法为:IsChunkAtWordBoundary(…)