SWT打印机作业未发送

时间:2014-01-17 20:15:25

标签: java printing swt

鉴于印刷时的SWT片段:

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class SWTPrint2
{

public static void main(String[] args)
{
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("Printing...");
    shell.open();

    PrinterData data = Printer.getDefaultPrinterData();
    if (data == null)
    {
        System.out.println("Warning: No default printer.");
        display.dispose();
        return;
    }
    Printer printer = new Printer(data);
    if (printer.startJob("SWT Printing Snippet"))
    {
        Color black = printer.getSystemColor(SWT.COLOR_BLACK);
        Color white = printer.getSystemColor(SWT.COLOR_WHITE);
        Color red = printer.getSystemColor(SWT.COLOR_RED);
        Rectangle trim = printer.computeTrim(0, 0, 0, 0);
        Point dpi = printer.getDPI();
        int leftMargin = dpi.x + trim.x; // one inch from left side of paper
        if (leftMargin < 0)
            leftMargin = -trim.x; // make sure to print on the printable area 
        int topMargin = dpi.y / 2 + trim.y; // one-half inch from top edge of paper
        if (topMargin < 0)
            topMargin = -trim.y; // make sure to print on the printable area 
        GC gc = new GC(printer);
        if (printer.startPage())
        {
            gc.setBackground(white);
            gc.setForeground(black);
            String testString = "Hello World!";
            Point extent = gc.stringExtent(testString);
            gc.drawString(testString, leftMargin, topMargin);
            gc.setForeground(red);
            gc.drawRectangle(leftMargin, topMargin, extent.x, extent.y);
            printer.endPage();
        }
        gc.dispose();
        printer.endJob();
    }
    printer.dispose();
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

}

如果你不做shell.open()并让用户关闭窗口,那么应用程序永远不会退出。

如果不调用shell.open()并以编程方式处理shell 要么 shell.open()shell.setVisible(false)和shell.close()在处理shell之前,应用程序退出到发送到打印机的打印作业之前。

(这是在linux上)。

我错过了什么?

我正在开发的应用程序正在有效地扩展jasperreports上的打印(实际上能够正确打印!)并且与打印对话框(如果需要)相比,GUI更少。我不希望用户除了选择打印机之外还要做任何其他事情并点击OK,如果我不需要,则不要显示无关的gui位。

由于JPS不能正确支持整理,因此适当输入垃圾箱或打印机质量SWT优于JPS。我使用来自JFree的SWTGraphics2D渲染页面,因为需要支持SWT进行打印。 SWT还提供合理的编程访问打印机选项(通过devmode或gtk结构曝光)。

任何帮助表示赞赏!

0 个答案:

没有答案