2015-06-10 46 views
3

我需要使用Java在紙上打印HTML文件。我可以在Reference from Stackoverflow的指導下在一篇論文中打印出內容。但是,它打印原始的HTML。我需要打印HTML作爲網頁,就像應該在紙上畫一張桌子,而不是打印<table>如何使用Java打印HTML

我看到了一些使用Google搜索的帖子,但沒有任何幫助。我還發現了一種使用Desktop.print()的方法,但無法添加指向哪臺打印機和所有打印機的更多功能。

我也嘗試使用JEditorPane來打印它,但它正在打印一個空白頁。請參考下面的代碼。

public class PrintTemplateJEditor extends JEditorPane implements Printable, Serializable { 

public static void main(String arg[]) { 
    PrintTemplateJEditor template = new PrintTemplateJEditor(); 

    template.setContentType("application/octet-stream"); 
    try { 
     template.read(new BufferedReader(new FileReader("output.html")), ""); 


     PrinterJob job = PrinterJob.getPrinterJob(); 

     PrinterService ps = new PrinterService(); 
     // get the printer service by printer name 
     PrintService pss = PrintServiceLookup.lookupDefaultPrintService(); 
     job.setPrintService(pss); 
     job.setPrintable(template); 
     // if (job.printDialog()) { 
     job.print(); 
     // } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

@Override 
public int print(Graphics g, PageFormat pf, int pageIndex) throws PrinterException { 
    if (pageIndex > 0) { /* We have only one page, and 'page' is zero-based */ 
     System.out.println("NO PAGE..."); 
     return NO_SUCH_PAGE; 
    } 
    Graphics2D g2 = (Graphics2D) g; 
    g2.setColor(Color.black); 

    RepaintManager.currentManager(this).setDoubleBufferingEnabled(false); 
    Dimension d = this.getSize(); 
    double panelWidth = d.width; 
    double panelHeight = d.height; 
    double pageWidth = pf.getImageableWidth(); 
    double pageHeight = pf.getImageableHeight(); 
    double scale = pageWidth/panelWidth; 
    int totalNumPages = (int) Math.ceil(scale * panelHeight/pageHeight); 
    System.out.println("pages - " + totalNumPages); 
    // Check for empty pages 
    // if (pageIndex >= totalNumPages) 
    // return Printable.NO_SUCH_PAGE; 

    g2.translate(pf.getImageableX(), pf.getImageableY()); 
    g2.translate(0f, -pageIndex * pageHeight); 
    g2.scale(scale, scale); 
    this.paint(g2); 
    System.out.println("End"); 
    return Printable.PAGE_EXISTS; 
} 

}

我找到了另一種方式 - 轉換的HTML到PDF,然後打印出來,這是成功的,但其在應用CSS到HTML困難。而不是做所有這些,它更好地打印HTML。你能指導我嗎?

注:我知道它被一些人問過,但我面臨着一個不同的問題。所以,請不要將其標記爲複製

+0

你面臨什麼不同的問題?據我所知,所有在這裏提出的問題已經在SO上得到解答。 – Sinkingpoint

+0

不確定我完全理解*在紙上創建一個表格,而不是打印*。如果你不是在** CSS打印樣式之後**我認爲**對某個瀏覽器/操作系統組合進行截圖**是最好的選擇。 –

+0

@jangroth:我已更新。它打印原始HTML代碼而不是網頁。我在CSS之後。我需要將CSS應用於HTML並打印網頁。 – Anand

回答

2

我嘗試了不同的方法來打印HTML,並感謝您的所有意見。最後,我將使用FlyingSaucer Library,它可以簡單地將HTML轉換爲PDF,並將CSS應用於HTML。示例代碼轉換和打印是:

public class FlyingSaucer2PDF { 
public static final String HTML = "output.html"; 
public static final String PDF = "C:\\Temp\\Tested.pdf"; 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    FlyingSaucer2PDF f = new FlyingSaucer2PDF(); 
    try { 
     f.printPdf(); 
     f.print(null); 
    } catch (DocumentException | IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (PrintException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public void printPdf() throws DocumentException, IOException { 
    String url = new File(HTML).toURI().toURL().toString(); 
    OutputStream os = new FileOutputStream(PDF); 

    ITextRenderer renderer = new ITextRenderer(); 
    renderer.setDocument(url); 
    renderer.layout(); 
    renderer.createPDF(os); 

    os.close(); 
} 

public void print(File file) throws FileNotFoundException, PrintException { 
    PrinterService ps = new PrinterService(); 
    // get the printer service by printer name 
    PrintService pss = PrintServiceLookup.lookupDefaultPrintService();// ps.getCheckPrintService("Samsung ML-2850 Series PCL6 Class Driver"); 
    System.out.println("Printer - " + pss.getName()); 
    DocPrintJob job = pss.createPrintJob(); 
    DocAttributeSet das = new HashDocAttributeSet(); 
    Doc document = new SimpleDoc(new FileInputStream(new File(PDF)), DocFlavor.INPUT_STREAM.AUTOSENSE, das); 
    // new htmldo 
    PrintRequestAttributeSet pras = new HashPrintRequestAttributeSet(); 
    job.print(document, pras); 
} 

}

您可能會收到運行時錯誤,如NoSuchMethodFoundError(錯誤:

java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I with itext 2.1.7

,因爲庫未編譯版本可用如果您遇到任何此類錯誤,請使用core-renderer.jarDifferent REPO

3

可能是你可以使用的JTextPane這樣的:

JTextPane jtp = new JTextPane(); 
    jtp.setContentType("text/html"); 
    jtp.setText("<html></html>"); //Your whole html here.. 
    jtp.print(); 

我希望這有助於。乾杯

+0

或者JEditorPane可能是.. –

+0

我用JEditorPane已經試過了,但是它打印了一個空白頁面,我沒有得到任何錯誤。我已經使用JEditorPane上的示例代碼更新了我的文章。你能檢查我做錯了嗎? – Anand

+0

你爲什麼設置template.setContentType(「application/octet-stream」); ?嘗試將其更改爲template.setContentType(「text/html」); –