2016-07-25 96 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來說是一個巨大的數字,並且不會經常遇到。這是不太可能遇到更大的數字