我需要解析一个 PDF 文档。我已经实现了解析器并使用了iText库,到目前为止它可以正常工作。
但是不,我需要解析另一个在单词中间出现非常奇怪的空格的文档。例如,我得到:
Vo rber eitung auf die Motorr adsaison。Viele Motorr adf ahr er
所有粗体字都应该连接起来,但 PDF 解析器会以某种方式在字词中添加空格。但是当我将 PDF 中的内容复制并粘贴到文本文件中时,我没有得到这些空格。
首先,我认为这是因为我正在使用 PDF Parsing 库,但对于另一个库,我也遇到了完全相同的问题。
我查看singleSpaceWidth
了解析后的单词,我注意到它总是在变化,当它添加一个空格时。我试图手动将它们放在一起。但由于没有真正的模式来重新组合单词,这几乎是不可能的。
有没有其他人有类似的问题,甚至有解决该问题的方法?
根据要求,这里有更多信息:
- iText 版本 5.2.1
- http://prine.ch/whitespacesProblem.pdf(链接到 pdf)
使用 SemTextExtractionStrategy 解析:
PdfReader reader = new PdfReader("data/SpecialTests/SuedostSchweiz/" + src);
SemTextExtractionStrategy semTextExtractionStrategy = new SemTextExtractionStrategy();
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
// Set the page number on the strategy. Is used in the Parsing strategies.
semTextExtractionStrategy.pageNumber = i;
// Parse text from page
PdfTextExtractor.getTextFromPage(reader, i, semTextExtractionStrategy);
}
这里是实际解析文本的 SemTextExtractionStrategy 方法。在那里,我在每个解析的单词之后手动添加了一个空格,但它确实在检测中拆分了单词:
@Override
public void parseText(TextRenderInfo renderInfo, int pageNumber) {
this.pageNumber = pageNumber;
String text = renderInfo.getText();
currTextBlock.getText().append(text + " ");
....
}
这是整个 SemTextExtraction 类,但在那里它只调用上面的方法(parseText):
public class SemTextExtractionStrategy implements TextExtractionStrategy {
// Text Extraction Strategies
public ColumnDetecter columnDetecter = new ColumnDetecter();
// Image Extraction Strategies
public ImageRetriever imageRetriever = new ImageRetriever();
public int pageNumber = -1;
public ArrayList<TextParsingStrategy> textParsingStrategies = new ArrayList<TextParsingStrategy>();
public ArrayList<ImageParsingStrategy> imageParsingStrategies = new ArrayList<ImageParsingStrategy>();
public SemTextExtractionStrategy() {
// Add all text parsing strategies which are later on applied on the extracted text
// textParsingStrategies.add(fontSizeMatcher);
textParsingStrategies.add(columnDetecter);
// Add all image parsing strategies which are later on applied on the extracted text
imageParsingStrategies.add(imageRetriever);
}
@Override
public void beginTextBlock() {
}
@Override
public void renderText(TextRenderInfo renderInfo) {
// TEXT PARSING
for(TextParsingStrategy strategy : textParsingStrategies) {
strategy.parseText(renderInfo, pageNumber);
}
}
@Override
public void endTextBlock() {
}
@Override
public void renderImage(ImageRenderInfo renderInfo) {
for(ImageParsingStrategy strategy : imageParsingStrategies) {
strategy.parseImage(renderInfo);
}
}
}