을 사용하여 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을 위치로
은 무슨 일이 일어나는가? 'PatternType1.java : 278'과'PDFRenderer.java : 261' – Brian
더 많은 데이터를 얻기위한 제안 : 코드에서 예외를 잡아라. catch 블록에서 버퍼의 내용을 디스크 파일로 덤프하고 pdf 읽기 프로그램에서 엽니 다. 또한, 항상 전체 입력 파일을 읽고 계십니까? –
@Brian 나는 내가 알 수 있다고 생각하지 않는다. 이것이 com.sun 코드입니다. –