2013-12-12 4 views
2

을 사용하여 PDF 문서를 인쇄하려고합니다. 나는 파일의 간단한 변환을하는 인쇄 가능한 개체를 만듭니다 (이전에 다른 주제에서 파생 된 기술).PDF 렌더러가 0으로 나누기 발생

private static void printDocument(File finalFile, PrintService printer, String name) throws PrinterException { 

    System.out.println(String.format("Starting %s document", name)); 

    FileInputStream fileInputStream = null; 
    try { 

     fileInputStream = new FileInputStream(finalFile); 
     byte[] pdfContent = new byte[fileInputStream.available()]; 
     fileInputStream.read(pdfContent, 0, fileInputStream.available()); 
     ByteBuffer buffer = ByteBuffer.wrap(pdfContent); 
     final PDFFile pdfFile = new PDFFile(buffer); 

     //Create Printable object in preparation for printing 
     Printable printable = new Printable() { 

      public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { 

       int pagenum = pageIndex + 1; 
       if ((pagenum >= 1) && (pagenum <= pdfFile.getNumPages())) { 

        Graphics2D graphics2D = (Graphics2D) graphics; 
        PDFPage page = pdfFile.getPage(pagenum); 

        Rectangle imageArea = new Rectangle((int) pageFormat.getImageableX(), (int) pageFormat.getImageableY(), 
          (int) pageFormat.getImageableWidth(), (int) pageFormat.getImageableHeight()); 

        graphics2D.translate(0, 0); 
        PDFRenderer pdfRenderer = new PDFRenderer(page, graphics2D, imageArea, null, null); 

        try { 
         page.waitForFinish(); 
         pdfRenderer.run(); 
        } 
        catch (InterruptedException e) { 
         e.printStackTrace(); 
         throw new PrinterException("Oh noes!"); 
        } 
        return PAGE_EXISTS; 
       } 
       else { 
        return NO_SUCH_PAGE; 
       } 
      } 
     }; 

     PrinterJob printJob = PrinterJob.getPrinterJob(); 

     printJob.setPrintService(printer); 

     PageFormat pageFormat = printJob.defaultPage(); 
     Book book = new Book(); 
     book.append(printable, pageFormat, pdfFile.getNumPages()); 
     printJob.setPageable(book); 

     Paper paper = new Paper(); 
     paper.setImageableArea(0, 0, paper.getWidth(), paper.getHeight()); 
     pageFormat.setPaper(paper); 


     PrintRequestAttributeSet pset = new HashPrintRequestAttributeSet(); 
     printJob.setJobName(finalFile.getName() + 
       "|" + String.valueOf(1) + 
       "|" + ("T")); 

     printJob.print(pset); 
    } 

    catch (Exception e) { 
     e.printStackTrace(); 
     throw new PrinterException(); 
    } 
    finally { 
     if (fileInputStream != null) { 
      try { 
       fileInputStream.close(); 
      } 
      catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    System.out.println(String.format("Finished %s document", name)); 
} 

특정 특별한 경우 PDF 파일 는)합니다 (pdfRenderer.run에 실패,이 변환 프로세스에 잘 응답하지 않는다 이 스택 트레이스와 라인 :이 내용은 인쇄 중간, 심지어 텍스트 라인의 중심을 가로 질러 중지 파일에 문자 그대로 (다소 유머러스) 파일이 중간을 통해 실패 원인과 결과

java.lang.ArithmeticException:/by zero 
    at com.sun.pdfview.pattern.PatternType1$Type1PaintContext.getRaster(PatternType1.java:354) 
    at sun.java2d.pipe.AlphaPaintPipe.renderPathTile(AlphaPaintPipe.java:106) 
    at sun.java2d.pipe.DuctusShapeRenderer.renderTiles(DuctusShapeRenderer.java:147) 
    at sun.java2d.pipe.DuctusShapeRenderer.renderPath(DuctusShapeRenderer.java:100) 
    at sun.java2d.pipe.DuctusShapeRenderer.fill(DuctusShapeRenderer.java:50) 
    at sun.java2d.pipe.PixelToParallelogramConverter.fill(PixelToParallelogramConverter.java:146) 
    at sun.java2d.pipe.ValidatePipe.fill(ValidatePipe.java:142) 
    at sun.java2d.SunGraphics2D.fill(SunGraphics2D.java:2376) 
    at sun.print.ProxyGraphics2D.fill(ProxyGraphics2D.java:1381) 
    at com.sun.pdfview.pattern.PatternType1$TilingPatternPaint.fill(PatternType1.java:278) 
    at com.sun.pdfview.PDFRenderer.fill(PDFRenderer.java:261) 
    at com.sun.pdfview.PDFShapeCmd.execute(PDFShapeCmd.java:77) 
    at com.sun.pdfview.PDFRenderer.iterate(PDFRenderer.java:570) 
    at com.sun.pdfview.BaseWatchable.run(BaseWatchable.java:101) 
    at **MYFILEHERE** 

.

이 오류의 원인은 무엇입니까? 렌더링 프로세스 내에서 개별적인 모양 조작을 다루는 낮은 수준에서 발생합니다. 이는 내가 처리 할 수없는 수준이라고 생각합니다. 내 프로세스를 허용 할 수있는 방법이 있습니까 손상된 데이터을 우회하여 전체 문서를 렌더링하는 것을 계속할 수 있습니까? 은 com.sun 패키지 이름에 의해 제안, 오히려 별도의 프로젝트here을 위치로

+0

은 무슨 일이 일어나는가? 'PatternType1.java : 278'과'PDFRenderer.java : 261' – Brian

+0

더 많은 데이터를 얻기위한 제안 : 코드에서 예외를 잡아라. catch 블록에서 버퍼의 내용을 디스크 파일로 덤프하고 pdf 읽기 프로그램에서 엽니 다. 또한, 항상 전체 입력 파일을 읽고 계십니까? –

+0

@Brian 나는 내가 알 수 있다고 생각하지 않는다. 이것이 com.sun 코드입니다. –

답변

1

그것이 나오는 것에 따라, 실행되고 있던 코드는 썬의 자바의 공식 코드의 일부가 아니 었습니다. 코드는 오픈 소스입니다.이 파일을 확인하고 this 파일을 수정하고 쉽게 새 항아리를 모두 만들 수 있습니다. 또한 가능한 경우 프로젝트에 수정 사항을 제공하려고합니다.

해결 방법은 전술 한 0으로 나누기 오류를 방지하기위한 검사를 추가하는 것입니다.

원래 코드 :

xloc %= useXStep; 
yloc %= useYStep; 

고정 코드 :

if (xstep != 0) 
    xloc %= useXStep; 
if (ystep != 0) 
    yloc %= useYStep;