我需要解析一个PDF文档。我已经实现了解析器并使用了库 iText,到目前为止它一直没有出现任何问题。
但是现在我需要解析另一个文档,其中单词之间会有非常奇怪的空格。例如:
Vo rber eitung auf die Motorr adsaison. Viele Motorr adf ahr er
所有加粗的单词都应该连在一起,但是 PDF 解析器却在单词中添加了空格。但是当我将内容从 PDF 复制并粘贴到文本文件中时,我却没有得到这些空格。
起初我以为是因为我使用的 PDF 解析库的问题,但是我使用另一个库仍然存在相同的问题。
我查看了解析后的单词中的 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);
}
}
}