iText"在允许范围外协调"使用LocationTextLocationStrategy的异常

时间:2018-04-11 17:49:18

标签: java exception itext itext7

异常"在允许的范围外协调"当我尝试使用LocationTextExtractionStrategy时抛出。

for (int pageNum = 1; pageNum <= document.getNumberOfPages(); pageNum++)
{
    PdfPage page = document.getPage(pageNum);
    sb.append(PdfTextExtractor.getTextFromPage(page, new LocationTextExtractionStrategy()));
}

有关例外的更多信息:

java.lang.IllegalStateException: Coordinate outside allowed range

    at com.itextpdf.kernel.pdf.canvas.parser.clipper.ClipperBase.rangeTest(ClipperBase.java:76)

我有2个类似的PDF由同一个软件生成,第一个抛出异常,第二个没有。

PDF 1 (exception)

PDF 2 (ok)

在第一个PDF中抛出此异常是什么?如何在不使用SimpleTextExtractionStrategy的情况下解决这个问题?

1 个答案:

答案 0 :(得分:1)

(根据您的堆栈跟踪,您使用的是iText 7. *版本。我相应地更新了您的问题标签,并使用当前的iText 7.1.2-SNAPSHOT重现了该问题。)

在第一个PDF中抛出此异常是什么?

简而言之

您的PDF文件包含用于定义剪辑路径的极端 y 坐标(超出ISO 32000-1实施限制),您的PDF 1只是PDF 2和iText剪辑路径例程开始hickup的两倍极端'介于两者之间。

详细

PDF 1第1页的页面内容流基本上如下所示:

> negative
[1] "AB" "TS"
> positive
[1] "CV" "CL"

因此,即使考虑到CTM的初始修改,您也要六次定义剪切路径矩形,其高度为q [...] % modifyCTM 0.802969 0 0 -0.802969 0 842 cm [...] q 0 0 741 98417 re W n [...] Q q 0 0 741 98417 re W n [...] Q q 0 0 741 98417 re W n [...] Q q 0 0 741 98417 re W n [...] Q q 0 0 741 98417 re W n [...] Q q 0 0 741 98417 re W n [...] Q Q 默认用户单位,大约等于98417 * 0.802969个默认用户单位。

ISO 32000-1附录C.2 建筑限制表示

  

符合要求的读者应该容纳符合约束条件的PDF文件。

     

[...]

     
      
  • 默认用户空间中最小页面大小应为3乘3单位;最大值应为14,400乘以14,400个单位。
  •   

因此,您的剪辑路径矩形是符合读者预期支持的页面的五倍以上。因此,符合标准的读者无需支持您的极端剪辑路径。

PDF 2类似地构建,所讨论的剪辑路径仅仅是79026单位高,即约41879 * 0.802969个单位,其仅仅是需要支持的两倍多。出于某些原因,iText似乎仍然支持这一点。

如何在不使用SimpleTextExtractionStrategy?

的情况下解决这个问题

您可以通过更改常量33628

来调整iText 7
com.itextpdf.kernel.pdf.canvas.parser.clipper.ClipperBridge.floatMultiplier

你可以尝试例如/** * Since the clipper library uses integer coordinates, we should convert * our floating point numbers into fixed point numbers by multiplying by * this coefficient. Vary it to adjust the preciseness of the calculations. */ public static double floatMultiplier = Math.pow(10, 14); 对我的两个文件都有效。

话虽如此,ISO 32000-2似乎已经删除了这个特定的页面大小限制,只有更多的通用限制以及特定设备上运行的特定PDF处理器以及特定操作环境中的语句将始终有实际限制。

因此,@ iText应考虑当前限制是否为实际限制或应放宽。