关于这两天研究Java打印pdf方法的记录
来源:互联网 发布:mac懒人系统下载地址 编辑:程序博客网 时间:2024/04/30 11:44
这两天在研究Java调用打印机打印PDF文件的方法,学到了不少东西,特别来记录一下。
关于Java打印网上最多的并且也是Java正统的打印方法就是使用PrintService,一套比较标准的打印代码如下:
public class PrintDemo {public static void main(String[] args) {JFileChooser fileChooser = new JFileChooser(); // 创建打印作业int state = fileChooser.showOpenDialog(null);if (state == JFileChooser.APPROVE_OPTION) {File file = fileChooser.getSelectedFile(); // 获取选择的文件// 构建打印请求属性集HashPrintRequestAttributeSet pras = new HashPrintRequestAttributeSet();// 设置打印格式,因为未确定类型,所以选择autosenseDocFlavor flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;// 查找所有的可用的打印服务PrintService printService[] = PrintServiceLookup.lookupPrintServices(flavor, pras);// 定位默认的打印服务PrintService defaultService = PrintServiceLookup.lookupDefaultPrintService();// 显示打印对话框PrintService service = ServiceUI.printDialog(null, 200, 200,printService, defaultService, flavor, pras);if (service != null) {try {DocPrintJob job = service.createPrintJob(); // 创建打印作业FileInputStream fis = new FileInputStream(file); // 构造待打印的文件流DocAttributeSet das = new HashDocAttributeSet();Doc doc = new SimpleDoc(fis, flavor, das);job.print(doc, pras);} catch (Exception e) {e.printStackTrace();}}}}}
但是经过尝试之后,发现pdf文件并没有以pdf的格式打印出来,而是打印出乱码(也就是文件的二进制码)
初步猜想是打印机无法识别吧。于是将上面的DocFlavor改成DocFlavor.INPUT_STREAM.PDF;
那么printService[]将会为null,为什么呢?因为lookupDefaultPrintService()方法只会返回支持docFlavor的打印机~
若未通过docFlavor来过滤打印机,而直接进行打印时,会报错:invalid flavor,也就是不支持该类型~
其实我们看docFlavor,它其实也就是发送到打印机的数据流的content-type,类似到web中,也就是不支持该content-type,那么就比较容易理解了。
后来从网上找到的解释是:
Java print service API本身支持打印, 但其并不具有解释PDF文件的能力,也就是说,用标准的Java Print API能够打印PDF文件, 但所用的打印机必须支持PDF打印标准,即打印机支持Post Script标准, 而这种打印机通常昂贵,目前市场上流通的廉价打印机(使用基于主机的驱动程序)基本不支持
那怎么办呢?难道我们就没办法通过Java程序来打印pdf文件了吗?不管有没有,至少要去试试吧~
发现网上并没有特别好的解决方案。大概收集了几种:
1、比较偷懒的方法,调外挂程序来实现打印,最典型的就是Adobe Reader
2、使用PdfRenderer等第三方库先将pdf文件转换成图片,那么就可以调用PrintService来打印了
先说第一种方法吧~
首先你的电脑上得装上Adobe Reader,调用Adobe Reader来打印需要依赖acrord32这个命令
我们知道在Java中要调用命令行需要Runtime对象,具体代码如下:
public static boolean printPdf(String pdfPath){try{Runtime.getRuntime().exec("cmd.exe /C start acrord32 /P /h " + pdfPath);return true;}catch(Exception e){e.printStackTrace();return false;}}
这里调用了Adobe Reader的acrord32.exe方法,下面来介绍下这个命令的参数。
acrord32.exe filename - 执行Adobe Reader,并且浏览PDF
其他还支持的参数有:
AcroRd32.exe /p filename - 执行Adobe Reader,并且打印一个PDF文件
AcroRd32.exe /t path printername drivername portname
初始化Adobe Reader, 不弹出打印对话框,然后结束打印
/t 命令所需的四个参数有
path - 打印文件路径
printername - 打印机名字
drivername - 打印机驱动名字
portname - 打印机端口
其他的参数:
/n 开一个新的Adobe Reader, 尽管有Adobe Reader已经打开 (静默打印不用)
/s 打开一个Adobe Reader不开splash screen
/o 打开一个Adobe Reader不开打开文件对话框
/h 以最小化方式打开一个Adobe Reader (静默打印使用)
- 关于这两天研究Java打印pdf方法的记录
- 关于这两天的学到的一些java编界面时的一些技巧或方法。
- 关于这两天收集的知识点(未整理) -- JAVA 基础
- 关于研究了两天的TransformFeedback的一些东西
- 这两天研究JSON
- 关于我对于tomcat6 研究两天的经验总结
- Java调用cmd的静默打印PDF方法
- 记录我这两天工作的点滴
- 关于这两天遇到的一个问题
- 关于这两天的自定义标签
- 关于Acad的cui(研究adobe pdf)
- 这两天研究了FFmpeg发送流媒体的命令
- 关于记录报表打印次数的记录
- 记录:关于java反射的几个方法
- 记录下这两天的零零点点
- 记录下这两天部署ss的过程
- Java实现PDF打印的解决方案
- Java实现PDF打印的解决方案
- 107个常用javascript语句(转载)
- adb shell 无法启动 (insufficient permissions for device)
- org.hibernate.LazyInitializationException: could not initialize proxy - no Session
- 用firebreath开发支持所有浏览器的截屏控件
- android 源码大全
- 关于这两天研究Java打印pdf方法的记录
- 爱聊语音聊天室为什么用不了摄像头?
- hdu 4801模拟题
- CDH cloudera-manager-installer.bin 安装过程
- tomcat起不来
- ORACLE LOCK_MODE
- 文本框事件
- 成员函数内定义static变量
- iOS开发网络数据之AFNetworking使用