iteye_20204 2008-11-15 08:58
浏览 256
已采纳

Java 打印字符串

我首次接触Java打印,我想打印一个我在程序中拼的字符串。请问该怎么实现???
[b]问题补充:[/b]
上一站,火星的答案,我已经测试过这种方式。目前我想这样实现,代码如下:

PrintService service = PrintServiceLookup.lookupDefaultPrintService();
DocPrintJob dpj = service.createPrintJob();
String str = "我要测试一下打印机,哈哈哈哈哈哈哈哈哈哈哈哈哈哈!";
InputStream inputStream = new ByteArrayInputStream(str.getBytes());

Doc doc = new SimpleDoc(inputStream, DocFlavor.INPUT_STREAM.AUTOSENSE, null);
PrintRequestAttributeSet praSet = new HashPrintRequestAttributeSet();
praSet.add(MediaSizeName.ISO_A4);
praSet.add(new Copies(1));

try {
dpj.print(doc, praSet);
} catch (PrintException e) {
e.printStackTrace();
}
[b]问题补充:[/b]
这种方式可以调用打印机,但是打印机不打印数据。请问这是什么原因?
[b]问题补充:[/b]
火星,你好!谢谢你的耐心解答。你刚才的答案,这种方式我也测试过,打印GIF,文件都可以。但是好像在程序拼接的字符串唯独不可以,这应该跟DocFlavor文档数据类型有关系。难道只能把字符串回到2D
图形上打印??
[b]问题补充:[/b]
这种类型,打印机不支持。错误如下:
sun.print.PrintJobFlavorException: invalid flavor
at sun.print.Win32PrintJob.print(Win32PrintJob.java:296)
at com.haoqingwei.example.print.PrintDemo.main(PrintDemo.java:61)

我的打印机支持一下DocFlavor类型:
MediaSubtype:******gif
MediaType:******image
MimeType:******image/gif

RepresentationClassName:******[B

MediaSubtype:******gif
MediaType:******image
MimeType:******image/gif

RepresentationClassName:******java.io.InputStream

MediaSubtype:******gif
MediaType:******image
MimeType:******image/gif

RepresentationClassName:******java.net.URL

MediaSubtype:******jpeg
MediaType:******image
MimeType:******image/jpeg

RepresentationClassName:******[B

MediaSubtype:******jpeg
MediaType:******image
MimeType:******image/jpeg

RepresentationClassName:******java.io.InputStream

MediaSubtype:******jpeg
MediaType:******image
MimeType:******image/jpeg

RepresentationClassName:******java.net.URL

MediaSubtype:******png
MediaType:******image
MimeType:******image/png

RepresentationClassName:******[B

MediaSubtype:******png
MediaType:******image
MimeType:******image/png

RepresentationClassName:******java.io.InputStream

MediaSubtype:******png
MediaType:******image
MimeType:******image/png

RepresentationClassName:******java.net.URL

MediaSubtype:******x-java-jvm-local-objectref
MediaType:******application
MimeType:******application/x-java-jvm-local-objectref

RepresentationClassName:******java.awt.print.Pageable

MediaSubtype:******x-java-jvm-local-objectref
MediaType:******application
MimeType:******application/x-java-jvm-local-objectref

RepresentationClassName:******java.awt.print.Printable

MediaSubtype:******octet-stream
MediaType:******application
MimeType:******application/octet-stream

RepresentationClassName:******[B

MediaSubtype:******octet-stream
MediaType:******application
MimeType:******application/octet-stream

RepresentationClassName:******java.net.URL

MediaSubtype:******octet-stream
MediaType:******application
MimeType:******application/octet-stream

RepresentationClassName:******java.io.InputStream

  • 写回答

7条回答 默认 最新

  • iteye_14081 2008-11-15 09:16
    关注

    打印工作常包含两部分:

    • 作业控制——创建一个打印作业,将它连接到打印机,指定打印的副本数,用户打印对话交互。
    • 页面成像——将内容绘制到页面,并管理超出页面的内容。

    首先,创建一个打印任务。这个类代表了一个打印任务,大部分相关的类都位于java.awt.print包中。
    [code="java"]import java.awt.print.*;
    PrinterJob job = PrinterJob.getPrinterJob();[/code]

    接着,提供代码实现Printable接口将内容呈递给页面。
    [code="java"]class HelloWorldPrinter implements Printable {…}
    ……
    job.setPrintable(new HelloWorldPrinter());[/code]

    一个应用程序通常会显示一个打印对话框,用户可以通过它改变各种选项,例如:设置打印副本数目,页面方向,或者目标打印机。
    boolean doPrint = job.printDialog();
    这个对话框一直显示直到用户批准打印或者取消打印。如果用户给出命令去继续打印,变量doPrint将会为true。如果用户取消了打印,doPrint为false。因为显示这个对话框完全是可选的,所以返回值纯粹是提供信息的。

    如果doPrint变量为true,程序将通过调用PrinterJob.print方法来让作业执行打印请求。
    [code="java"]if (doPrint) {
    try {
    job.print();
    } catch (PrinterException e) {
    /* The job did not successfully complete */
    }
    }
    [/code]
    如果在将作业传递给打印机过程中出现问题时,PrinterException将被抛出。然而,因为PrinterJob.print方法在将作业传递给打印机后立即返回,所以用户的程序无法检测到夹纸或缺纸这些问题。这个打印作业控制样本对基本的打印用户已经足够了。

    Printable接口只有一个方法:
    [code="java"]public int print(Graphics graphics, PageFormat pf, int page) throws PrinterException;[/code]

    PageFormat类描述了页面的定位信息、它的尺寸以及每英尺可绘制的区域(单位1/72nd)。可绘制区解释了大多数打印机的边界限制(硬件边界)。可绘区是位于这些边界之内的区域,实际应用中,经常为留出页眉和页脚而进一步限制这些边界。

    page参数是一个从0开始的页面编号。

    下面的代码展示了完整的Printable接口实现:
    [code="java"]import java.awt.print.*;
    import java.awt.*;

    public class HelloWorldPrinter implements Printable {
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
    if (page > 0) {
    return NO_SUCH_PAGE;
    }
    Graphics2D g2d = (Graphics2D)g;
    g2d.translate(pf.getImageableX(), pf.getImageableY());
    g.drawString("Hello World!", 100, 100);

    return PAGE_EXISTS;
    }
    }[/code]

    发送一个图形实例到打印机本质上和将它发送到屏幕上一样。这两种情况你都需要做如下步骤:

    • 向一个二维图形绘制内容的其它操作,像绘制测试字符串一样容易。
    • 打印图形要一个很高的分辨率,这应该对大多数代码是透明的。
    • Printable.print()方法被打印系统调用,就像在屏幕上显示空间时调用Component.praint()一样。打印系统将为页面0,1,……调用Printable.print()方法,知道返回NO_SUCH_PAGE.
    • print()方法可以被同一个页面调用很多次,知道文档完成。这一特性将在用户指定打印多个副本时用到。
    • PageFormat的可绘制区域决定了剪切区域。可打印区域在计算分页数或如何控制打印内容的范围时同样很重要,因为分页符是通过每页适应的程度来定义。

    提示:对某些页面索引,print()方法可能会跳过,如果用户指定了不同的页面范围,指定了某些不被包含在内的特定页面索引。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。