以下是我使用的代码(使用itext for.net版本7.0.4.0),用于从PDF中提取文本。我在测试中观察到的是,仅在大多数PDF的矩形内提取内容,它可以很好地工作。但是对于其中的几个,它从PDF提供了整行。我知道
与RECT相交的文本片段(因此文本的一部分可能在rect之外,Itext不会将文本片段切成部分)。
,但我想了解PDF中的哪些参数将在ITEXT中使用以拆分文本。
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();
这应该可以解决问题。
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对象分为其角色的相应事件。然后(如果他们在搜索区域中)我们将呼叫委派给另一个ItextextrateTrategy。