以下是我用于从pdf中提取文本的代码(使用iText for .Net Version 7.0.4.0)。我在测试过程中观察到的是,只有在大多数pdf中提取矩形内容才能很好地工作。但是对于其中很少一部分,它给出了pdf中的整行。我知道
与rect相交的文本片段(因此文本的一部分可能在rect之外,iText不会将文本片段分割成碎片)。
但我想了解在iText中使用pdf中的哪个参数来分割文本。
var reader = new PdfReader( filePath );
PdfDocument pdfDoc = new PdfDocument( reader );
var addressRect = new Rectangle( 33, 190, 70, 42 ); //
var addressRegionFilter = new TextRegionEventFilter( addressRect );
var filterListener = new FilteredTextEventListener( new LocationTextExtractionStrategy(), addressRegionFilter );
var addressText = PdfTextExtractor.GetTextFromPage( pdfDoc.GetPage( 1 ), filterListener );
pdfDoc.Close();
答案 0 :(得分:2)
这应该可以解决问题。
class RectangleTextExtractionStrategy implements ITextExtractionStrategy
{
private ITextExtractionStrategy innerStrategy = null;
private Rectangle rectangle;
public RectangleTextExtractionStrategy(ITextExtractionStrategy strategy, Rectangle rectangle)
{
this.innerStrategy = strategy;
this.rectangle = rectangle;
}
@Override
public String getResultantText() {
return innerStrategy.getResultantText();
}
@Override
public void eventOccurred(IEventData iEventData, EventType eventType) {
if(eventType != EventType.RENDER_TEXT)
return;
TextRenderInfo tri = (TextRenderInfo) iEventData;
for(TextRenderInfo subTri : tri.getCharacterRenderInfos())
{
Rectangle r2 = new CharacterRenderInfo(subTri).getBoundingBox();
if(intersects(r2))
innerStrategy.eventOccurred(subTri, EventType.RENDER_TEXT);
}
}
private boolean intersects(Rectangle rectangle)
{
// # TODO
return true;
}
@Override
public Set<EventType> getSupportedEvents() {
return innerStrategy.getSupportedEvents();
}
}
这里的想法是将所有传入的TextRenderInfo对象拆分为其角色的相应事件。然后(如果它们在搜索区域中)我们将调用委托给另一个ITextExtractionStrategy。