我得到"在允许范围外协调java.lang.IllegalStateException"在pdf文档中应用编辑时出现异常。
我已尝试过各种坐标,但每次都出现相同的异常。请你帮我们解答为什么我只为特定文件获得此例外。
异常追踪: 原因:在允许范围外协调 java.lang.IllegalStateException:在允许的范围外协调 at com.itextpdf.text.pdf.parser.clipper.ClipperBase.rangeTest(ClipperBase.java:120) at com.itextpdf.text.pdf.parser.clipper.ClipperBase.rangeTest(ClipperBase.java:122) at com.itextpdf.text.pdf.parser.clipper.ClipperBase.addPath(ClipperBase.java:194) at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRegionFilter.addPath(PdfCleanUpRegionFilter.java:418) at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRegionFilter.filterFillPath(PdfCleanUpRegionFilter.java:173) at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRenderListener.filterCurrentPath(PdfCleanUpRenderListener.java:368) at com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRenderListener.renderPath(PdfCleanUpRenderListener.java:207) at com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.paintPath(PdfContentStreamProcessor.java:377)
使用itextpdf-5.5.9和itext-xtra-5.5.9
示例代码:
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetPdf));
stamper.setRotateContents(false);
List<PdfCleanUpLocation> cleanUpLocations = new ArrayList<PdfCleanUpLocation>();
Rectangle rectangle = new Rectangle(400, 600, 500, 650);
cleanUpLocations.add(new PdfCleanUpLocation(1, rectangle, BaseColor.BLACK));
PdfCleanUpProcessor cleaner = new PdfCleanUpProcessor(cleanUpLocations, stamper);
cleaner.cleanUp();
stamper.close();
reader.close();
答案 0 :(得分:0)
这个问题与以下事实有关:我们在某些操作期间使用long数据类型作为PDF中坐标的内部表示。做出这一决定是为了避免精确损失。 您提供的文档的内容流包含绘制带坐标(0,0,65535,65535)的矩形的命令。在某些时候 cleaner.cleanUp(); 操作时,我们必须使用PDF内容流中指定的坐标而不应用任何转换矩阵。为了将其转换为long,每个坐标都乘以一个公共常量 PdfCleanUpProcessor.floatMultiplier ,目前等于10 ^ 14。然后将65535 * 10 ^ 14与最大长数(即4611686018427387903)进行比较,并且被认为超出范围,因为65535 * 10 ^ 14更大。 我们可以将PdfCleanUpProcessor.floatMultiplier更改为0.5 * 10 ^ 14或10 ^ 13。这应该可以在其他情况下使用,因为65535对于PDF来说是一个巨大的数字,并且不经常遇到。它极不可能遇到更大的数字