如何读取PDF右侧旋转文本?iText提取时缺失内容问题
问题:提取PDF文本时遗漏旋转内容
我使用以下代码提取PDF文本:
string text = ""; using (PdfReader pdfReader = new PdfReader(dlg.FileName)) { for (int page = 1; page <= pdfReader.NumberOfPages; page++) { text = PdfTextExtractor.GetTextFromPage(pdfReader, page); } } text = text.Replace("\r\n", "\n");
运行后得到结果:
"AI(240)10575323190069 AI(13)240215 24-02-15 (YY-MM-DD) PI-734875-1 19006 © Inter IKEA Systems B.V. 2021 105.753.23 Made in Pakistan"
但结果遗漏了PDF最右侧的旋转文本“2407”,如何修改代码以同时读取该旋转文本及所有内容?
解决方案
默认的PdfTextExtractor采用LocationTextExtractionStrategy,该策略会基于文本布局位置提取内容,可能会遗漏旋转角度特殊的文本。可通过以下两种方式解决:
1. 使用SimpleTextExtractionStrategy
该策略按文本在PDF内容流中的原始顺序提取,不依赖布局,能捕获所有文本(包括旋转内容):
string text = ""; using (PdfReader pdfReader = new PdfReader(dlg.FileName)) { for (int page = 1; page <= pdfReader.NumberOfPages; page++) { // 替换为SimpleTextExtractionStrategy text += PdfTextExtractor.GetTextFromPage(pdfReader, page, new SimpleTextExtractionStrategy()); } } text = text.Replace("\r\n", "\n");
2. 自定义文本提取策略(精准处理旋转文本)
如果需要保留布局逻辑的同时捕获旋转文本,可以自定义策略处理特定角度的文本:
public class RotatedTextExtractionStrategy : LocationTextExtractionStrategy { protected override void RenderText(TextRenderInfo renderInfo) { // 获取文本基线的旋转角度 float rotation = renderInfo.GetBaseline().GetStartPoint().GetRotation(); // 兼容正负90度旋转的文本(可根据实际旋转角度调整阈值) if (Math.Abs(rotation - Math.PI / 2) < 0.01 || Math.Abs(rotation + Math.PI / 2) < 0.01) { base.RenderText(renderInfo); } else { base.RenderText(renderInfo); } } }
使用自定义策略提取文本:
text += PdfTextExtractor.GetTextFromPage(pdfReader, page, new RotatedTextExtractionStrategy());
补充说明
SimpleTextExtractionStrategy适合优先保证文本完整性、对输出顺序要求不高的场景;- 自定义策略可在保留布局提取逻辑的基础上,精准适配特定旋转角度的文本内容。
内容的提问来源于stack exchange,提问作者SYED RASHID
相关产品推荐
相关产品推荐

