java调用虚拟打印机

长智齿的程序媛 2015-05-28 08:57:33
要实现 将上传的word 或者 excel 在下载过程中,可以调用虚拟打印机,输出 PDF 格式。具体怎么操作和代码编写。求大神指点啊、。。急急急
...全文
1629 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
加文哥 2016-11-02
  • 打赏
  • 举报
回复
楼主成功了没?
国家的风度 2016-10-25
  • 打赏
  • 举报
回复
楼主解决了没?我的是直接调用默认打印机是没有问题的,但想要设置打印机属性就出现类型错误。
Sky15978986 2016-01-07
  • 打赏
  • 举报
回复
楼主最后成功了没
  • 打赏
  • 举报
回复
追加问题不知道能不能看得到。。。 关于2楼您提供的方法。 怎么把打印成功的pdf文件存放到指定的目录呢?
  • 打赏
  • 举报
回复
或者说,Java里有没有代码可以设置 打印机的属性,设置打印机的默认存储路径
  • 打赏
  • 举报
回复
引用 20 楼 rui888 的回复:
我没遇到啊,具体的你网上搜搜看看。

public  static void  print(String path)throws SystemException {   
        String PRINT_NAME="xxxxxxxxx";//打印机名称
        //初始化COM线程
        ComThread.InitSTA();
        ActiveXComponent xl=new ActiveXComponent("Excel.Application");
        try { 
             
            //设置是否显示打开Excel  
            Dispatch.put(xl, "Visible", new Variant(true));
            //打开具体的工作簿
            Dispatch workbooks = xl.getProperty("Workbooks").toDispatch(); 
            Dispatch excel=Dispatch.call(workbooks,"Open",path).toDispatch(); 
             
            //设置打印属性并打印
            Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),
                    new Boolean(false),PRINT_NAME, new Boolean(true),Variant.VT_MISSING, ""});
             
            //关闭文档
           Dispatch.call(excel, "Close", new Variant(false));  
        } catch (Exception e) { 
            e.printStackTrace();
            throw new SystemException(e.getMessage());
        } finally{
            xl.invoke("Quit",new Variant[0]);
            //始终释放资源 
            ComThread.Release(); 
        } 
    }
这段代码里。换成word时, //设置打印属性并打印 Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1), new Boolean(false),PRINT_NAME, new Boolean(true),Variant.VT_MISSING, ""}); 这里设置打印机属性需要改动么
  • 打赏
  • 举报
回复
引用 18 楼 rui888 的回复:
改为word ActiveXComponent xl=new ActiveXComponent("Excel.Application"); ActiveXComponent xxx= new ActiveXComponent("Word.Application");
我贴上去的代码就是把 excel.application 改成了 word.application.。
  • 打赏
  • 举报
回复
引用 13 楼 rui888 的回复:
虚拟打印机 ? 就是当前网络中的打印机啊。
我设置打印机的名称的时候,就是调用了安装的虚拟打印机,excel很成功的就转换了。word就是不行。您帮忙看下?谢谢
  • 打赏
  • 举报
回复
引用 13 楼 rui888 的回复:
虚拟打印机 ? 就是当前网络中的打印机啊。
您再帮我看下那个word我改的哪里不对。11楼的代码,谢谢了
tony4geek 2015-06-17
  • 打赏
  • 举报
回复
虚拟打印机 ? 就是当前网络中的打印机啊。
tony4geek 2015-06-17
  • 打赏
  • 举报
回复
改为word ActiveXComponent xl=new ActiveXComponent("Excel.Application"); ActiveXComponent xxx= new ActiveXComponent("Word.Application");
  • 打赏
  • 举报
回复
引用 16 楼 rui888 的回复:
saveWordAspdf("d:/1234.doc","d:/1234.pdf"); 是 .doc-----〉.docx 的原因吗?
运行那个word转pdf的代码之后,会有这个错误 com.jacob.com.ComFailException: A COM exception has been encountered: At Invoke of: PrintOut Description: 80020005 / 类型不匹配。 at com.jacob.com.Dispatch.invokev(Native Method) at com.jacob.com.Dispatch.invokev(Dispatch.java:625) at com.jacob.com.Dispatch.callN(Dispatch.java:453) at cn.yyy.excel.SaveWordAspdf.print(SaveWordAspdf.java:59) at cn.yyy.excel.SaveWordAspdf.main(SaveWordAspdf.java:78) java.lang.Exception at cn.yyy.excel.SaveWordAspdf.print(SaveWordAspdf.java:67) at cn.yyy.excel.SaveWordAspdf.main(SaveWordAspdf.java:78) 在main方法里,不管是从.doc转.pdf 还是.docx 转pdf.都会报这个错
tony4geek 2015-06-17
  • 打赏
  • 举报
回复
saveWordAspdf("d:/1234.doc","d:/1234.pdf"); 是 .doc-----〉.docx 的原因吗?
  • 打赏
  • 举报
回复
引用 1 楼 rui888 的回复:


public void saveExcelAsPdf(String filePath, String outFile) 
		throws SystemException {
		ComThread.InitSTA();
		ActiveXComponent actcom = new ActiveXComponent("Excel.Application");
		Dispatch workbooks = null;
		Dispatch workbook = null;
		
		try {			
			actcom.setProperty("Visible", new Variant(false));
			
			workbooks = actcom.getProperty("Workbooks").toDispatch();
			workbook = Dispatch.invoke(
					workbooks,
					"Open",
					Dispatch.Method,
					new Object[] { filePath, 
							new Variant(false),
							new Variant(false) //readonly
					}, new int[9]).toDispatch();
						
			
			Dispatch.invoke(workbook, "SaveAs", Dispatch.Method, new Object[] {
					outFile, new Variant(57), new Variant(false),
					new Variant(57), new Variant(57), new Variant(false),
					new Variant(true), new Variant(57), new Variant(false),
					new Variant(true), new Variant(false) }, new int[1]);
			
			Dispatch.call(workbook, "Close", new Object[] { new Variant(false) });
			if (actcom != null) {
				actcom.invoke("Quit", new Variant[] {});
				actcom = null;
			}
			ComThread.Release();
			
		} catch (Exception e) {
			throw new SystemException(e.getMessage());
		} finally {
			if (actcom != null) {
				actcom.invoke("Quit", new Variant[] {});
				actcom = null;
			}
			ComThread.Release();
		}
	}


public  static void  print(String path)throws SystemException {   
		String PRINT_NAME="xxxxxxxxx";//打印机名称
		//初始化COM线程
        ComThread.InitSTA();
        ActiveXComponent xl=new ActiveXComponent("Excel.Application");
        try { 
        	
            //设置是否显示打开Excel  
            Dispatch.put(xl, "Visible", new Variant(true));
            //打开具体的工作簿
            Dispatch workbooks = xl.getProperty("Workbooks").toDispatch(); 
            Dispatch excel=Dispatch.call(workbooks,"Open",path).toDispatch(); 
            
            //设置打印属性并打印
            Dispatch.callN(excel,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),
                    new Boolean(false),PRINT_NAME, new Boolean(true),Variant.VT_MISSING, ""});
            
            //关闭文档
           Dispatch.call(excel, "Close", new Variant(false));  
        } catch (Exception e) { 
            e.printStackTrace();
            throw new SystemException(e.getMessage());
        } finally{
            xl.invoke("Quit",new Variant[0]);
            //始终释放资源 
            ComThread.Release(); 
        } 
	}




word 也差不多,具体很多参数去网上搜搜看看。
您这个也没有用到虚拟打印机啊?
  • 打赏
  • 举报
回复
引用 10 楼 rui888 的回复:
你自己抛一个异常啊。 这个是我其他库里面的异常。我本地pdf 。word 。excel 打印都没问题。

您能 帮我再看看么,excel转PDF的弄成功了,我改了word的,但是有些问题实在解决不了,谢谢您啦。

public class SaveWordAspdf {


public static void saveWordAspdf(String filePath, String outFile) throws Exception {
ComThread.InitSTA();
ActiveXComponent actcom = new ActiveXComponent("Word.Application");
Dispatch documents = null;
Dispatch document = null;

try {
actcom.setProperty("Visible", new Variant(false));

documents = actcom.getProperty("Documents").toDispatch();
document = Dispatch.invoke(documents,"Open", Dispatch.Method, new Object[] {
filePath, new Variant(false), new Variant(false)
}, new int[17]).toDispatch();

Dispatch.invoke(document, "SaveAs", Dispatch.Method, new Object[] {
outFile,new Variant(false),new Variant(false)},new int[17]);
Dispatch.call(document, "Close", new Object[] { new Variant(false) });
if (actcom != null) {
actcom.invoke("Quit", new Variant[] {});
actcom = null;
}
ComThread.Release();

} catch (Exception e) {
e.printStackTrace();
} finally {
if (actcom != null) {
actcom.invoke("Quit", new Variant[] {});
actcom = null;
}
ComThread.Release();
}
}


public static void print(String path)throws Exception {
String PRINT_NAME="pdfFactory Pro";//打印机名称
//初始化COM线程
ComThread.InitSTA();
ActiveXComponent doc=new ActiveXComponent("Word.Application");
try {

//设置是否显示打开word
Dispatch.put(doc, "Visible", new Variant(true));
//打开具体的工作簿
Dispatch documents = doc.getProperty("Documents").toDispatch();
Dispatch word = Dispatch.call(documents,"Open",path).toDispatch();

//设置打印属性并打印
Dispatch.callN(word,"PrintOut",new Object[]{Variant.VT_MISSING, Variant.VT_MISSING, new Integer(1),
new Boolean(false),PRINT_NAME, new Boolean(true),Variant.VT_MISSING, ""});

//关闭文档
Dispatch.call(word, "Close", new Variant(false));
} catch (Exception e) {
e.printStackTrace();
throw new Exception();
} finally{
doc.invoke("Quit",new Variant[0]);
//释放资源
ComThread.Release();
}
}
public static void main(String[] args) {
try {
System.out.println(0);
saveWordAspdf("d:/1234.doc","d:/1234.pdf");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}



运行之后,会有这个弹框出现,也能转存成PDF,但是不像excel那个一样,直接后台转换成功。
并且,转换完成后,eclipse里面还会提示错误


tony4geek 2015-05-28
  • 打赏
  • 举报
回复
你自己抛一个异常啊。 这个是我其他库里面的异常。我本地pdf 。word 。excel 打印都没问题。
  • 打赏
  • 举报
回复
引用 8 楼 rui888 的回复:
现在就是Com 没成功。初始化没成功。 就是环境的问题。 dll 或者word 的问题。
我刚试了您给的示例代码, throw new SystemException(e.getMessage()); 这里编译通不过,提示不能实例化:Cannot instantiate the type SystemException
  • 打赏
  • 举报
回复
引用 6 楼 rui888 的回复:
你那个dll 也拷贝 system 下了? 有64 位,32 位的。 我测试是通过的 。
我是64位的。 dll我放在了SYSWOW64里面
加载更多回复(6)
设计一个SP00LING输出进程和两个请求输出的用户进程,以及一个SP00LING输出服务程序。当请求输出的用户进程希望输出一系列信息时,调用输出服务程序,由输出服务程序将该信息送入输出井。待遇到一个输出结束标志时,表示进程该次的输出文件输出结束。之后,申请一个输出请求块(用来记录请求输出的用户进程的名字、信息在输出井中的位置、要输出信息的长度等),等待SP00LING进程进行输出。 SP00LING输出进程工作时,根据请求块记录的各进程要输出的信息,将其实际输出到打印机或显示器。这里,SP00LING输出进程与请求输出的用户进程可并发运行。 (1)功能分析 当输入“第一个用户进程的请求为:”,“第二个用户进程的请求为:”后,按下“确定”键,再右侧文本区中将显示两个请求输出的用户进程请求的数据,以及SPOOLING输出进程输出的数据。其中两个请求输出的用户进程的调度的概率各为0.45,SPOOLING输出进程的调度为0.10,该调度以随机数发生器产生的随机数来模拟。 (2)进程状态 进程基本状态有3种,分别为可执行、等待和结束。可执行态就是进程正在运行或等待调度的状态;等待状态又分为等待状态1、等待状态2和等待状态3。 状态变化的条件为: ①进程执行完成时,置为“结束”态。 ②服务程序在将输出信息送输出井时,如发现输出井已满,将调用进程置为“等待状态1”。 ③SP00LING进程在进行输出时,若输出井空,则进入“等待状态2”。 ④SP00LING进程输出一个信息块后,应立即释放该信息块所占的输出井空间,并将正在等待输出的进程置为“可执行状态”。 ⑤服务程序在输出信息到输出井并形成输出请求信息块后,若SP00LING进程处于等待态,则将其置为“可执行状态”。 ⑥当用户进程申请请求输出块时,若没有可用请求块时,调用进程进人“等待状态3”。

58,452

社区成员

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

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