[jcifs] Re: Some printer questions

Eric Glass eric.glass at gmail.com
Mon Jan 15 11:34:47 GMT 2007


As followup, attached is an example test class I'm using to print a
simple HTML file through JEditorPane.

On 1/14/07, Eric Glass <eric.glass at gmail.com> wrote:
> Mike,
>
> I had a couple of questions around printing; I've hacked together what
> I need to work, but looking for the "best" approach.
>
> Basically, I'm generating PostScript via Java2D and dumping that to a
> printer; I've gotten this to work by setting
> jcifs.smb.client.useNTSmbs = false and then adding the following in
> SmbTree.java (around line 75, where it is checking the "allowable"
> commands):
>
>     case SMB_COM_WRITE:
>
>
> (apparently only SMB_COM_WRITE_ANDX is currently supported, causing
> jCIFS to spit out "Invalid operation for LPT1: service" with NT SMBs
> switched off).
>
> I guess my question is, is there any "cleaner" way to do this?  Seems
> funky to disable NT SMBs globally, and recompiling for a one-line
> change is also a pain.  Any thoughts?
>
>
> Eric
>
-------------- next part --------------
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;

import java.awt.print.PageFormat;
import java.awt.print.Printable;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;

import javax.print.Doc;
import javax.print.DocFlavor;
import javax.print.DocPrintJob;
import javax.print.PrintService;
import javax.print.SimpleDoc;
import javax.print.StreamPrintServiceFactory;

import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.RepaintManager;

import javax.swing.text.html.HTMLEditorKit;

import jcifs.Config;

import jcifs.smb.SmbFileOutputStream;

public class PrintHtml {

    public static void main(String[] args) throws Exception {
        Config.setProperty("jcifs.smb.client.useNTSmbs", "false");
        String htmlFile = args[0];
        String printerUrl = args[1];
        StringWriter collector = new StringWriter();
        PrintWriter writer = new PrintWriter(collector);
        BufferedReader reader = new BufferedReader(new FileReader(htmlFile));
        String line;
        while ((line = reader.readLine()) != null) writer.println(line);
        writer.flush();
        String content = collector.toString();
        final JEditorPane pane = new JEditorPane();
        pane.setEditorKit(new HTMLEditorKit());
        pane.setText(content);
        JFrame frame = new JFrame();
        frame.getContentPane().add(pane);
        frame.pack();
        Printable printable = new Printable() {
            public int print(Graphics g, PageFormat format, int pageIndex) {
                RepaintManager currentManager =
                        RepaintManager.currentManager(pane);
                boolean doubleBuffering =
                        currentManager.isDoubleBufferingEnabled();
                if (doubleBuffering) {
                    currentManager.setDoubleBufferingEnabled(false);
                }
                try {
                    Dimension size = pane.getSize();
                    double panelWidth = size.width;
                    double panelHeight = size.height;
                    double pageHeight = format.getImageableHeight();
                    double pageWidth = format.getImageableWidth();
                    double scale = pageWidth / panelWidth;
                    int totalNumPages = (int)
                            Math.ceil(scale * panelHeight / pageHeight);
                    if (pageIndex >= totalNumPages) {
                        return Printable.NO_SUCH_PAGE;
                    }
                    Graphics2D g2 = (Graphics2D) g;
                    g2.translate(format.getImageableX(),
                            format.getImageableY());
                    g2.translate(0f, -pageIndex * pageHeight);
                    g2.scale(scale, scale);
                    pane.paint(g2);
                    return Printable.PAGE_EXISTS;
                } finally {
                    if (doubleBuffering) {
                        currentManager.setDoubleBufferingEnabled(true);
                    }
                }
            }
        };
        DocFlavor flavor = DocFlavor.SERVICE_FORMATTED.PRINTABLE;
        Doc doc = new SimpleDoc(printable, flavor, null);
        StreamPrintServiceFactory[] factories =
                StreamPrintServiceFactory.lookupStreamPrintServiceFactories(
                        null, "application/postscript");
        OutputStream output = new SmbFileOutputStream(printerUrl);
        PrintService service = factories[0].getPrintService(output);
        DocPrintJob job = service.createPrintJob();
        job.print(doc, null);
        output.flush();
        output.close();
        System.exit(0);
    }

}


More information about the jcifs mailing list