繁体   English   中英

"如何在 Java 中打印 HTML"

[英]How to print the HTML in Java

我需要使用 Java 在论文中打印 HTML 文件。 我可以在Stackoverflow 参考的指导下打印出论文中的内容。 但是,它打印原始 HTML。 我需要将 HTML 打印为网页,就像应该在纸上画一个表格,而不是打印<table>

我通过谷歌搜索看到了一些帖子,但没有任何帮助。 我还找到了一种使用 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。 你能指导我吗?

注意:我知道有人问过它,但我面临一个不同的问题。 所以,请不要将其标记为重复

可能你可以像这样使用JTextPane:

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

我希望这有帮助。 干杯

我尝试了不同的方法来打印HTML并感谢您的所有评论。 最后,我将使用FlyingSaucer库 ,它可以将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

因为上述网站提供的未编译版本的库。 如果您遇到任何此类错误,请使用不同REPO中core-renderer.jar

renderer.createPDF(os); 为什么总是这个标志我一个错误?

"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM