发生异常:原因:坐标超出允许范围java.lang.IllegalStateException:坐标超出允许范围

Exception occur :Reason : Coordinate outside allowed range java.lang.IllegalStateException: Coordinate outside allowed range

我在 pdf 文档中应用修订时遇到 "Coordinate outside allowed range java.lang.IllegalStateException" 异常。

我尝试过各种坐标,但每次都出现相同的异常 showing.Could 请您帮助我们,为什么我只针对特定文档获得此异常。

异常跟踪: 原因:坐标超出允许范围 java.lang.IllegalStateException: 坐标超出允许范围 在 com.itextpdf.text.pdf.parser.clipper.ClipperBase.rangeTest(ClipperBase.java:120) 在 com.itextpdf.text.pdf.parser.clipper.ClipperBase.rangeTest(ClipperBase.java:122) 在 com.itextpdf.text.pdf.parser.clipper.ClipperBase.addPath(ClipperBase.java:194) 在 com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRegionFilter.addPath(PdfCleanUpRegionFilter.java:418) 在 com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRegionFilter.filterFillPath(PdfCleanUpRegionFilter.java:173) 在 com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRenderListener.filterCurrentPath(PdfCleanUpRenderListener.java:368) 在 com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRenderListener.renderPath(PdfCleanUpRenderListener.java:207) 在 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();

这个问题与我们itext在某些操作中使用long数据类型作为PDF中坐标的内部表示有关。做出这个决定是为了避免精度损失。 您提供的文档的内容流中包含绘制坐标为(0,0,65535,65535)的矩形的命令。在某些时候 cleaner.cleanUp(); 操作,我们必须使用 PDF 内容流中指定的坐标,而不应用任何转换矩阵。为了将其转换为长整数,每个坐标都乘以一个 public 常量 PdfCleanUpProcessor.floatMultiplier ,目前等于 10^14。然后65535*10^14与最大的长数(即4611686018427387903)进行比较,认为超出范围,因为65535*10^14更大。 我们可以将 PdfCleanUpProcessor.floatMultiplier 更改为 0.5*10^14,或 10^13。这在其他情况下应该是可用的,因为 65535 对于 PDF 来说是一个巨大的数字,并且不经常遇到。遇到更大的数字的可能性很小