Java调用打印机的问题

若即 2017-03-20 12:13:27
这是关于Java调用打印机的问题的,当我把打印数据格式设置为AUTOSENSE时,可以找到打印服务

选择虚拟打印机打印成pdf,生成Java Printint.pdf文件
但打印出的pdf文件不能打开

当我把打印数据的格式设置为TEXT_PLAIN_UTF_8时就找不到打印服务了
txt的编码已经设置为UTF-8
public class PrintTest
{
public static void main(String[] args)
{
FileInputStream psStream=null;
try
{
psStream=new FileInputStream("F:\\test.txt");
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}

if(psStream==null)
{
return;
}

//设置打印数据的格式,此处为图片gif格式
DocFlavor psInFormat=DocFlavor.INPUT_STREAM.AUTOSENSE;

//创建打印数据
Doc myDoc=new SimpleDoc(psStream,psInFormat,null);

//设置打印属性
PrintRequestAttributeSet aset=new HashPrintRequestAttributeSet();
//aset.add(new Copies(3));
//查找所有打印服务
PrintService[] services= PrintServiceLookup.lookupPrintServices(psInFormat,aset);
//将所有查找出来的打印机与自己想要的打印机进行匹配,找出自己想要的打印机
PrintService myPrint=null;
System.out.println(services.length);
for(int i=0;i<services.length;i++)
{
System.out.println("service found "+services[i]);
String svcName=services[i].toString();
if(svcName.contains("PDF"))
{
myPrint=services[i];
System.out.println("myPrinter found "+svcName);
System.out.println("myPrinter founr "+myPrint);
break;
}
}

//可以输出打印机的各项属性
AttributeSet att=myPrint.getAttributes();

for(Attribute a:att.toArray())
{
String attributeName;
String attributeValue;

attributeName=a.getName();
attributeValue=att.get(a.getClass()).toString();

System.out.println(attributeName+":"+attributeValue);
}

if(myPrint!=null)
{
DocPrintJob job=myPrint.createPrintJob();//创建文档打印作业
try
{
job.print(myDoc,aset);
}
catch(Exception e)
{
e.printStackTrace();
}
}
else
{
System.out.println("no print services found");
}
}
}
...全文
1394 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ly708888234 2019-04-29
  • 打赏
  • 举报
回复
柘城基本原理sss sdf safsfsdfsd
qq_28075415 2017-11-29
  • 打赏
  • 举报
回复
//查找所有打印服务 PrintService[] services= PrintServiceLookup.lookupPrintServices(psInFormat,aset); 我就想问一下,服务器连接了两台一模一样的打印机A和B,这句system.out.println("service found "+services[i]); 输出的A,B打印机属性都一样,唯一能区别打印机A,B的就只能根据A,B的name来区分,也就是这句:attributeName=a.getName(); 也就是A,B打印机连接到服务器后要分别改一下别名,而且别名需要唯一,才能区分出A,B。 那么问题来了: Java还有没有其他方法定位到唯一一台打印机服务?比如根据打印机的IP(这个我了解,java是获取不到连接到服务器的打印机的IP的) 各位大神还有没有其他方法。
VioletKiss 2017-09-18
  • 打赏
  • 举报
回复
引用 7 楼 qq_17004327 的回复:
[quote=引用 6 楼 q1119823309 的回复:] 请问楼主解决这个问题了吗,我也遇到了

public static void printToFile(int fileType) throws PrinterException
    {
        //相关变量的定义和初始化
        File file = FileHelper.getFile(fileType);

        // 创建打印作业
        PrinterJob job = PrinterJob.getPrinterJob();

        //调用UI界面选择打印服务
        PrintService service = ServiceUI.printDialog(null, 200, 200,
                printServices, defaultService, flavor, pras);

        job.setPrintService(service);
        JEditorPane reportPane = new JEditorPane();
        reportPane.setContentType("txt/html");
        HTMLEditorKit kit=new HTMLEditorKit();
        reportPane.setEditorKit(kit);
        HTMLDocument doc= (HTMLDocument) reportPane.getDocument();

        try
        {
            if (file != null)
            {
                FileInputStream   reader   =   new FileInputStream(file);
                kit.read(reader,doc,0);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (BadLocationException e)
        {
            e.printStackTrace();
        }

        //把JEditorPane的可打印范围传入到打印作业中
        job.setPrintable(reportPane.getPrintable(null, null));
        //打印开始
        job.print();
    }
思路是创建一个JEditorPane,然后把内容输入到JEditorPane里面,然后获取JEditorPane的打印区域再打印。我是这样解决的,感觉很牵强[/quote] 好的,不过刚发现我跟楼主做的不是一个东西,我用pdfbox处理pdf 文件
若即 2017-09-17
  • 打赏
  • 举报
回复
引用 6 楼 q1119823309 的回复:
请问楼主解决这个问题了吗,我也遇到了

public static void printToFile(int fileType) throws PrinterException
    {
        //相关变量的定义和初始化
        File file = FileHelper.getFile(fileType);

        // 创建打印作业
        PrinterJob job = PrinterJob.getPrinterJob();

        //调用UI界面选择打印服务
        PrintService service = ServiceUI.printDialog(null, 200, 200,
                printServices, defaultService, flavor, pras);

        job.setPrintService(service);
        JEditorPane reportPane = new JEditorPane();
        reportPane.setContentType("txt/html");
        HTMLEditorKit kit=new HTMLEditorKit();
        reportPane.setEditorKit(kit);
        HTMLDocument doc= (HTMLDocument) reportPane.getDocument();

        try
        {
            if (file != null)
            {
                FileInputStream   reader   =   new FileInputStream(file);
                kit.read(reader,doc,0);
            }
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (BadLocationException e)
        {
            e.printStackTrace();
        }

        //把JEditorPane的可打印范围传入到打印作业中
        job.setPrintable(reportPane.getPrintable(null, null));
        //打印开始
        job.print();
    }
思路是创建一个JEditorPane,然后把内容输入到JEditorPane里面,然后获取JEditorPane的打印区域再打印。我是这样解决的,感觉很牵强
VioletKiss 2017-09-12
  • 打赏
  • 举报
回复
请问楼主解决这个问题了吗,我也遇到了
若即 2017-03-20
  • 打赏
  • 举报
回复
找不到打印服务的截图
若即 2017-03-20
  • 打赏
  • 举报
回复
引用 3 楼 zs808 的回复:
每个打印机都有其打印的文件格式信息,Microsoft PDF Printer打印的是PDF,你选PLAIN_TEXT当然不行。 至于文件打不开,需要确认的是,是文件格式错误还是文件读写权限的问题。另外,你用其它程序(比如记事本)用Microsoft PDF Printer打印试试,看能不能正常打开。
设置为PDF也是找不到打印服务,那个INPUT_STREAM是指输入文件的格式还是指打印输出的格式?
逗泥丸的平方 2017-03-20
  • 打赏
  • 举报
回复
代码59行有空指针 debug看一下 看看是什么没取到呀.
若即 2017-03-20
  • 打赏
  • 举报
回复
引用 2 楼 qq_35209952 的回复:
代码59行有空指针 debug看一下 看看是什么没取到呀.
引用 2 楼 qq_35209952 的回复:
代码59行有空指针 debug看一下 看看是什么没取到呀.
原来的59行是这行AttributeSet att=myPrint.getAttributes(); 只是设置为TEXT_PLAIN_UTF_8的时候才会出现空指针
zs808 2017-03-20
  • 打赏
  • 举报
回复
每个打印机都有其打印的文件格式信息,Microsoft PDF Printer打印的是PDF,你选PLAIN_TEXT当然不行。 至于文件打不开,需要确认的是,是文件格式错误还是文件读写权限的问题。另外,你用其它程序(比如记事本)用Microsoft PDF Printer打印试试,看能不能正常打开。

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧