2016-07-25 9 views
0

pdfドキュメントで修正を適用しているときに、「座標範囲外の許容範囲を超えています。例外が発生しました:理由:許容範囲外の座標です。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) at com.itextpdf.text.pdf.parser.clipper.ClipperBase.addPath(ClipperBase.java:194) at com com.itextpdf.text.pdfで.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRegionFilter.addPath(PdfCleanUpRegionFilter.java:418)com.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRegionFilter.filterFillPath(PdfCleanUpRegionFilter.java:173)で .pdfcleanup.PdfC leanUpRenderListener.filterCurrentPath(PdfCleanUpRenderListener.java:368)com.itextpdf.text.pdf.parser.PdfContentStreamProcessor.paintPathでcom.itextpdf.text.pdf.pdfcleanup.PdfCleanUpRenderListener.renderPath(PdfCleanUpRenderListener.java:207) で (PdfContentStreamProcessor。 Javaの:377)

使用しitextpdf-5.5.9とiTextの-エクストラ-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のは、長いデータ型を使用していることあるope中にPDF内の座標の内部表現として食糧。この決定は、精度の低下を避けるために行われました。 指定したドキュメントのコンテンツストリームに、座標(0,0,65535,65535)の四角形を描画するコマンドが含まれています。 cleaner.cleanUp(); 操作では、変換行列を適用せずにPDFコンテンツストリームで指定された座標を使用する必要があります。これをlongに変換するには、すべての座標にpublicの定数 PdfCleanUpProcessor.floatMultiplier を乗算します。これは現在10^14です。 65535 * 10^14が最も大きい長い番号(すなわち、4611686018427387903)と比較され、65535 * 10^14が大きいため、範囲外と見なされます。 PdfCleanUpProcessor.floatMultiplierを0.5 * 10^14または10^13に変更することがあります。これは、65535がPDFの膨大な数であり、頻繁に遭遇しないため、他の状況でも使用できるはずです。大きな数字に遭遇することはほとんどありません

関連する問題