异常"在允许的范围外协调"当我尝试使用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中抛出此异常是什么?如何在不使用SimpleTextExtractionStrategy的情况下解决这个问题?
答案 0 :(得分:1)
(根据您的堆栈跟踪,您使用的是iText 7. *版本。我相应地更新了您的问题标签,并使用当前的iText 7.1.2-SNAPSHOT重现了该问题。)
您的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似乎仍然支持这一点。
您可以通过更改常量33628
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应考虑当前限制是否为实际限制或应放宽。