使用LocationTextExtractionStrategy时抛出“Coordinate outside allowed range”异常
解决iText LocationTextExtractionStrategy抛出"Coordinate outside allowed range"异常
我碰到过不少开发者遇到这个问题,本质是iText底层依赖的Clipper库对整数坐标范围有严格限制——如果PDF页面里的文本或图形元素的坐标值过大(比如生成PDF的工具输出了异常的超大坐标),转换为Clipper要求的整数格式时就会超出有效范围,触发这个IllegalStateException。
下面给你几个针对性的解决办法:
1. 改用SimpleTextExtractionStrategy(无需位置信息时首选)
如果你的业务场景不需要保留文本的位置排版逻辑(比如不需要维持行顺序、段落结构),直接换成SimpleTextExtractionStrategy就好,它不会触发Clipper的坐标检查逻辑:
for (int pageNum = 1; pageNum <= document.getNumberOfPages(); pageNum++) { PdfPage page = document.getPage(pageNum); sb.append(PdfTextExtractor.getTextFromPage(page, new SimpleTextExtractionStrategy())); }
2. 自定义安全版LocationTextExtractionStrategy(需保留位置信息时)
如果必须基于位置提取文本,你可以继承LocationTextExtractionStrategy,在处理文本时捕获坐标异常,跳过有问题的元素:
public class SafeLocationTextExtractionStrategy extends LocationTextExtractionStrategy { @Override protected void processText(TextRenderInfo renderInfo) { try { super.processText(renderInfo); } catch (IllegalStateException e) { // 只处理坐标范围异常,其他异常正常抛出 if (e.getMessage() != null && e.getMessage().contains("Coordinate outside allowed range")) { // 可选:记录日志,方便后续排查问题PDF // System.out.println("Skipping problematic text element on page: " + renderInfo.getPageNumber()); return; } throw e; } } }
然后在代码中使用这个自定义策略:
for (int pageNum = 1; pageNum <= document.getNumberOfPages(); pageNum++) { PdfPage page = document.getPage(pageNum); sb.append(PdfTextExtractor.getTextFromPage(page, new SafeLocationTextExtractionStrategy())); }
3. 修复PDF的异常坐标(可控PDF场景)
如果这个PDF是你自己生成或者可以修改的,可以先检查并修正页面的超大坐标:
for (int pageNum = 1; pageNum <= document.getNumberOfPages(); pageNum++) { PdfPage page = document.getPage(pageNum); Rectangle cropBox = page.getCropBox(); // 将页面坐标归一化到0起始的合理范围 Rectangle adjustedBox = new Rectangle(0, 0, cropBox.getWidth(), cropBox.getHeight()); page.setMediaBox(adjustedBox); page.setCropBox(adjustedBox); // 再提取文本 sb.append(PdfTextExtractor.getTextFromPage(page, new LocationTextExtractionStrategy())); }
注意:这个方法需要确保PDF内容不会因为坐标调整而出现错位,建议先测试少量PDF验证。
额外建议
如果用的是较旧版本的iText,建议升级到最新的稳定版(比如7.2.x及以上)——官方在后续版本中优化了Clipper的坐标处理逻辑,可能已经修复了这类边界问题。
内容的提问来源于stack exchange,提问作者Gustavo Piucco
相关产品推荐
相关产品推荐

