在Java内,实现打印要用到两个类:PrinteJob 和 实现Printable 接口的类。
打印的关键在于Printable接口的Print方法的实现。你可以把你要打印的文本
全部画到图形环境上,再打印。看看下面的代码,但愿能给你一些帮助: public int print(Graphics g, PageFormat pf, int page)
throws PrinterException
{ if (page >= 1) return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.black);
g2.translate(pf.getImageableX(), pf.getImageableY());
g2.draw(new Rectangle2D.Double(0, 0,
pf.getImageableWidth(), pf.getImageableHeight())); drawPage(g2);
return Printable.PAGE_EXISTS;
} public void drawPage(Graphics2D g2)
{ FontRenderContext context = g2.getFontRenderContext();
Font f = new Font("Serif", Font.PLAIN, 72);
GeneralPath clipShape = new GeneralPath(); TextLayout layout = new TextLayout("Hello", f, context);
AffineTransform transform
= AffineTransform.getTranslateInstance(0, 72);
Shape outline = layout.getOutline(transform);
clipShape.append(outline, false); layout = new TextLayout("World", f, context);
transform
= AffineTransform.getTranslateInstance(0, 144);
outline = layout.getOutline(transform);
clipShape.append(outline, false); g2.draw(clipShape);
g2.clip(clipShape); final int NLINES =50;
Point2D p = new Point2D.Double(0, 0);
for (int i = 0; i < NLINES; i++)
{ double x = (2 * getWidth() * i) / NLINES;
double y = (2 * getHeight() * (NLINES - 1 - i))
/ NLINES;
Point2D q = new Point2D.Double(x, y);
g2.draw(new Line2D.Double(p, q));
}
}
打印的关键在于Printable接口的Print方法的实现。你可以把你要打印的文本
全部画到图形环境上,再打印。看看下面的代码,但愿能给你一些帮助: public int print(Graphics g, PageFormat pf, int page)
throws PrinterException
{ if (page >= 1) return Printable.NO_SUCH_PAGE;
Graphics2D g2 = (Graphics2D)g;
g2.setPaint(Color.black);
g2.translate(pf.getImageableX(), pf.getImageableY());
g2.draw(new Rectangle2D.Double(0, 0,
pf.getImageableWidth(), pf.getImageableHeight())); drawPage(g2);
return Printable.PAGE_EXISTS;
} public void drawPage(Graphics2D g2)
{ FontRenderContext context = g2.getFontRenderContext();
Font f = new Font("Serif", Font.PLAIN, 72);
GeneralPath clipShape = new GeneralPath(); TextLayout layout = new TextLayout("Hello", f, context);
AffineTransform transform
= AffineTransform.getTranslateInstance(0, 72);
Shape outline = layout.getOutline(transform);
clipShape.append(outline, false); layout = new TextLayout("World", f, context);
transform
= AffineTransform.getTranslateInstance(0, 144);
outline = layout.getOutline(transform);
clipShape.append(outline, false); g2.draw(clipShape);
g2.clip(clipShape); final int NLINES =50;
Point2D p = new Point2D.Double(0, 0);
for (int i = 0; i < NLINES; i++)
{ double x = (2 * getWidth() * i) / NLINES;
double y = (2 * getHeight() * (NLINES - 1 - i))
/ NLINES;
Point2D q = new Point2D.Double(x, y);
g2.draw(new Line2D.Double(p, q));
}
}
如何打印我已经实现,我的问题是如何多次调print方法仍然可以在一页上打印而不是每调一次print打印机就换一次纸,因为我每次只用打印一行数据,比如说早上8:00在一张纸上打了第一行,然后晚上8:00我需要在同一张纸上打印第二行,如何实现呢?
Style/Report
print(Graphics g, PageFormat format, int pageIndex) 中对pageIndex 参数和方法的返回值 return Printable.PAGE_EXISTS 做修改。 改变方法的返回值可能会使得在下次print被调用时,影响pageIndex 的值。我没试过,你试试吧。
UNIX环境生成报表文件, 由另一个程序启动命令行命令打印这个报表 每页要有表头什么的, 要按一定行数换页. 如何去实现? 我现在的做法是: 在这个TXT的报表文件中, 计算行数, 够一页的时候, 就写表头的信息 所以. 用VI打开的时候, 可以看到象报表的样子, 有PAGE 页号什么的, 但不知道打印的时候会怎么样,客户要求用换页符, 我的方法可以吗? 不行的话,有什么其他的方法 ?
在线等待 ..................