2016-07-25 36 views
0

我在应用PDF文档中的编校时收到“协调超出允许范围java.lang.IllegalStateException”异常。发生异常:原因:协调超出允许范围java.lang.IllegalStateException:协调超出允许范围

我已经尝试过不同的坐标,但每次都显示相同的异常。请您帮助我们为什么我只为特定文档获取此例外。

异常跟踪: 原因:坐标超出允许范围 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.PdfC leanUpRenderListener.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(); 
+0

请分享您的关键代码和问题的PDF分析。 – mkl

+0

@mkl,请在此处查找PDF: https://drive.google.com/open?id=0B1tCWBHptWpuLXc5R2NkQ2U1NWM –

回答

0

此问题相关的事实,我们使用的iText 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来说是一个巨大的数字,并且不会经常遇到。这是不太可能遇到更大的数字