2015-06-10 44 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”); –