问题 Java Applet可以使用打印机吗?


Java Applet能够轻松地将text / html打印到标准打印机驱动程序(所有常见平台Win / Mac / Linux)吗?

需要签名吗?


10166
2018-01-13 09:10


起源



答案:


要打印,您需要使用 签名小程序 或者如果未签名的小程序尝试打印,系统将提示用户询问是否允许。

以下是使用JEditorPane打印HTML的示例代码:

public class HTMLPrinter implements Printable{
    private final JEditorPane printPane;

    public HTMLPrinter(JEditorPane editorPane){
        printPane = editorPane;
    }

    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex){
        if (pageIndex >= 1) return Printable.NO_SUCH_PAGE;

        Graphics2D g2d = (Graphics2D)graphics;
        g2d.setClip(0, 0, (int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight());
        g2d.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY());

        RepaintManager rm = RepaintManager.currentManager(printPane);
        boolean doubleBuffer = rm.isDoubleBufferingEnabled();
        rm.setDoubleBufferingEnabled(false);

        printPane.setSize((int)pageFormat.getImageableWidth(), 1);
        printPane.print(g2d);

        rm.setDoubleBufferingEnabled(doubleBuffer);

        return Printable.PAGE_EXISTS;
    }
}

然后将其发送到打印机:

HTMLPrinter target = new HTMLPrinter(editorPane);
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(target);
try{
    printJob.printDialog();
    printJob.print();
}catch(Exception e){
    e.printStackTrace();
}

10
2018-01-13 10:11



作为Neil COffey的回答,你不需要签名。 - Tom Hawtin - tackline
根据Neil Coffey的回答纠正 - grom
谢谢你的优秀代码!但是,我的测试数据存在一个问题:testPanel.setText(“<html> <h1>这是测试打印</ h1> blaa blaa </ html>”);纸上的输出显示HTML标签,因此不会格式化,例如标题,它只输出H1标签。 - Tom
汤姆,你必须使用HTMLEditorKit。在使用setText设置html内容之前,请尝试使用testPanel.setContentType(“text / html”) - grom
什么是必要的进口才能实现这一目标? - Derek P.


答案:


要打印,您需要使用 签名小程序 或者如果未签名的小程序尝试打印,系统将提示用户询问是否允许。

以下是使用JEditorPane打印HTML的示例代码:

public class HTMLPrinter implements Printable{
    private final JEditorPane printPane;

    public HTMLPrinter(JEditorPane editorPane){
        printPane = editorPane;
    }

    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex){
        if (pageIndex >= 1) return Printable.NO_SUCH_PAGE;

        Graphics2D g2d = (Graphics2D)graphics;
        g2d.setClip(0, 0, (int)pageFormat.getImageableWidth(), (int)pageFormat.getImageableHeight());
        g2d.translate((int)pageFormat.getImageableX(), (int)pageFormat.getImageableY());

        RepaintManager rm = RepaintManager.currentManager(printPane);
        boolean doubleBuffer = rm.isDoubleBufferingEnabled();
        rm.setDoubleBufferingEnabled(false);

        printPane.setSize((int)pageFormat.getImageableWidth(), 1);
        printPane.print(g2d);

        rm.setDoubleBufferingEnabled(doubleBuffer);

        return Printable.PAGE_EXISTS;
    }
}

然后将其发送到打印机:

HTMLPrinter target = new HTMLPrinter(editorPane);
PrinterJob printJob = PrinterJob.getPrinterJob();
printJob.setPrintable(target);
try{
    printJob.printDialog();
    printJob.print();
}catch(Exception e){
    e.printStackTrace();
}

10
2018-01-13 10:11



作为Neil COffey的回答,你不需要签名。 - Tom Hawtin - tackline
根据Neil Coffey的回答纠正 - grom
谢谢你的优秀代码!但是,我的测试数据存在一个问题:testPanel.setText(“<html> <h1>这是测试打印</ h1> blaa blaa </ html>”);纸上的输出显示HTML标签,因此不会格式化,例如标题,它只输出H1标签。 - Tom
汤姆,你必须使用HTMLEditorKit。在使用setText设置html内容之前,请尝试使用testPanel.setContentType(“text / html”) - grom
什么是必要的进口才能实现这一目标? - Derek P.


为了打印,安全管理器需要允许它访问打印机。这意味着要么对applet进行签名,要么至少使用 最新版本 Sun的Java插件, 如果未签名的小程序尝试打印,则会提示用户 询问是否允许。


5
2018-01-13 10:47



WEW!我讨厌一个随机网站开始在我的床单上打印垃圾邮件... :-) - PhiLho
PhiLho:有一个对话框。 JavaScript也可以这样做。 - Tom Hawtin - tackline
Neil Coffey:最新版本?它已经存在了十年。 - Tom Hawtin - tackline
汤姆 - 谢谢你的纠正 - 真的那么久......?你突然让我感觉很老了! :-) - Neil Coffey
即使是较新版本的JRE也可以使用JWS部署applet并使用 javax.jnlp.PrintService。它与不受信任的applet的“提示/打印”类似。 - Andrew Thompson