2014-09-08 3 views
1

Мне нужно распечатать HTML-файл из моего приложения Java. Я пробовал несколько методов. Двое из них работают, но не так, как ожидалось.Печать файла HTML в Java

Метод 1:

Проблема: Печать разрезают из после того, как три четверти листа.

try { 
     PrinterJob printJob = PrinterJob.getPrinterJob(); 

     PageFormat pageFormat = new PageFormat(); 
     pageFormat.setOrientation(PageFormat.LANDSCAPE); 

     Paper paper = new Paper(); // Set to A4 size. 
     paper.setSize(594.936, 841.536); // Set the margins. 
     paper.setImageableArea(0, 0, 594.936, 841.536); 
     pageFormat.setPaper(paper); 

     XHTMLPanel panel = new XHTMLPanel(); 
     panel.setDocument(new File("./documents/" + "Personalstamm" 
       + ".html")); 

     printJob.setPrintable(new XHTMLPrintable(panel), pageFormat); 
     if (printJob.printDialog()) { 

      printJob.print(); 
     } 
    } catch (Exception x) { 
     x.printStackTrace(); 
    } 

Метод 2:

Проблема: Отпечаток без стилей, установленных в HTML-файле.

PageFormat pageFormat = new PageFormat(); 
    Paper a4paper = new Paper(); 
    double paperWidth = 8.26; 
    double paperHeight = 11.69; 
    a4paper.setSize(paperWidth * 72.0, paperHeight * 72.0); 

    /* 
    * set the margins respectively the imageable area 
    */ 
    double leftMargin = 0.78; /* should be about 2cm */ 
    double rightMargin = 0.78; 
    double topMargin = 0.78; 
    double bottomMargin = 0.78; 

    a4paper.setImageableArea(leftMargin * 72.0, topMargin * 72.0, 
      (paperWidth - leftMargin - rightMargin) * 72.0, (paperHeight 
        - topMargin - bottomMargin) * 72.0); 
    pageFormat.setPaper(a4paper); 
    pageFormat.setOrientation(PageFormat.LANDSCAPE); 

    DocumentRenderer documentRenderer = new DocumentRenderer(pageFormat, 
      "Report"); 
    try { 
     FileInputStream stringReader = new FileInputStream(new File(
       "./documents/" + "Personalstamm" + ".html")); 
     HTMLEditorKit htmlKit = new HTMLEditorKit(); 
     HTMLDocument htmlDoc = (HTMLDocument) htmlKit 
       .createDefaultDocument(); 

     htmlKit.read(stringReader, htmlDoc, 0); 
     documentRenderer.print(htmlDoc); 
    } catch (Exception x) { 
     x.printStackTrace(); 
    } 

Есть ли у кого-нибудь идеи, как решить проблему в одном из этих методов? Или у кого-нибудь есть лучший способ распечатать файл с Java?

ответ

1

Вы не можете распечатать HTML с помощью CSS. Лучший выстрел, который у вас есть, - использовать PDFs, вот для чего они предназначены. Создайте PDF-код из HTML с помощью Java и распечатайте его

+0

В первом методе печати '' HTML' с CSS' возможно. Но распечатка разрезана. Я уже пробовал конвертировать в 'PDF', но он выглядит ужасно. – Stone

+0

Для первого подхода попробуйте поместить 'панель' в' JScrollPane', а затем попытайтесь распечатать его. Попробуйте 'JScrollPane scroll = новый JScrollPane (панель);' и затем распечатайте scrollPane. Вам нужно будет скопировать весь контент, но у вас больше контроля с помощью scrollpane – ItachiUchiha

1

Теперь я использую Apache PDFBox - A Java PDF Library, и это почти то, что я искал.

Мой код:

public void printFile(String fileName) { 
    //Convert to PDF 
    try { 
     ITextRenderer renderer = new ITextRenderer(); 
     renderer.setDocument(new File("./documents/html/"+fileName+".html")); 

     renderer.layout(); 

     String fileNameWithPath = "./documents/pdf/"+fileName+".pdf"; 
     FileOutputStream fos = new FileOutputStream(fileNameWithPath); 
     renderer.createPDF(fos); 

     fos.close(); 
    } catch (Exception x) { 
     x.printStackTrace(); 
    } 
    //Print with Dialog 
    try { 
     PrinterJob printJob = PrinterJob.getPrinterJob(); 
     PageFormat pageFormat = new PageFormat(); 
     pageFormat.setOrientation(PageFormat.LANDSCAPE); 
     Paper paper = new Paper(); 
     paper.setSize(595, 842); 
     paper.setImageableArea(0, 0, 595, 842); 
     pageFormat.setPaper(paper); 

     PDDocument doc = PDDocument.load(new File("./documents/pdf/"+fileName+".pdf")); 

     printJob.setPrintable(new PDPageable(doc), pageFormat); 

     if (printJob.printDialog()) { 
      printJob.print(); 
     } 
     doc.close(); 

    } catch (Exception x) { 
     x.printStackTrace(); 
    } 

} 
+2

На ваш исходный код, который является itext, а не PDFBox. –

Смежные вопросы