之前做一系统,有一个打印PDF文件的需求,需求如下:
- 能指定打印机
- 能两面打印
- 最好能静默打印
在网上找了一堆资料,没发现直接用Java打印的,只发现一个调用Adobe Reader来实现打印的方法,但它有一个问题,就是总有一个Adobe Reader进程是常驻的,而且会在服务器上显示出来,每次打印多个文件时,服务器一个劲地弹Adobe Reader的窗口;还有一个问题是它不支持双面打印。
然后想到我一直用开源工具SumatraPdf看PDF,SumatraPdf是不是支持打印呢?网上一找,SumatraPdf还真支持打印。写代码测试了一下,SumatraPdf打印进是静默的。本来以为直接用就行了,然后发现SumatraPdf也不支持双面打印。在网上找了一下,发现可以通过修改SumatraPdf代码来实现双面打印(参考地址),呵呵,这不就是我想要的吗?看了一下SumatraPdf的Licence协议,是GPL协议,不过我是用进程调用,是可以免费使用的。
2016/01/26: 最新版的SumatraPdf已经支持双面打印,无需修改代码
于是用SVN下载好SumatraPdf的源代码(下载地址)。源代码的vs文件夹里提供了Visual Studio 2010和Visual Studio 2012两个工程定义。个人建议用Visual Studio 2010打开编译,因为我试用了Visual Studio 2012,发现Visual Studio 2012编译的文件不支持Xp和2003(Visual Studio 2012Update1开始支持,不过Express版本好像不支持)。
然后就是修改方法了,需要修改的文件是src文件夹下的Print.cpp文件(最新版已经支持,修改方法已经删除 ),然后编译代码,SumatraPdf就准备好了。
SumatraPdf打印的命令行的参考地址如下:
https://github.com/sumatrapdfreader/sumatrapdf/wiki/Command-line-arguments
具体为
- 打印到指定打印机:
SumatraPdf.exe -print-to "打印机名" -print-settings "设置" "要打印的文件路径"
- 打印到默认打印机:
SumatraPdf.exe -print-to-default -print-settings "设置" "要打印的文件路径"
打印设置有以下几个选项(下文中的n和m为数字):
页面选择:
even
偶数页odd
奇数页n-m
第n页到第m页n
第n页- 没有设置为全部页面
页面大小:
noscale
无边框shrink
缩小到合适大小(默认)fit
合适大小compat
兼容
双面打印:
duplexshort
水平双面(两面的上下方向一样);duplex
或duplexlong
垂直双面(两面的上下方向不同);simplex
单面(默认)
打印份数:
nx
打印n份- 没有设置为打印1份
比如: 以水平双面无边框打印偶数页2份,其设置为 even,noscale,duplex,2x
SumatraPdf 下载地址
http://www.sumatrapdfreader.org/download-free-pdf-viewer-cn.html
因为我的是web项目,而且打印机是银行各大网点的,不可能都共享到服务器,谷歌是有自带的打印方法,但是会有预览窗口,window.print(),所以就找到了您的方法,但对我好像不太适用啊,不知道您还有好的方法没?多谢了
完全的Web项目无法使用这个方法。
一定要实现静默打印的话,只能修改Chrome的代码了。
请问一下可以打印服务器上的pdf吗?把exe文件布局在服务器上,pdf也在服务器上,实现静默打印可以吗?跪求啊
把exe文件布局在本地,本地能连接上服务器的话,应该能打印服务器上的文件
多谢您的回复,我这个项目发布在服务器上,pdf我可以放在本地也可以放在服务器,假设我把exe放到本地上,那我项目在服务器上,也就是说web项目拿不到本地的资源啊,所以只能去服务器上去拿,所以就很尴尬,因为服务器上并没有指定打印默认的打印机啊。谢谢了
那就只能把PDF和EXE文件都放在服务器,然后把本地打印机共享给服务器,然后在服务器打印
刚刚留言找错了地方,这个自动分页的参数是什么呢?谢谢
PDF没有自动分页吧,生成PDF时就已经固定页面了啊。
打印多份PDF时候的自动分页,SumatraPDF打印弹出框有一个checkBox,叫做自动分页。我想知道这个参数怎么设置
实在对不起,好久都没看SumatraPDF的程序了,我也不太了解,你去看看它的文档,看看里面是不是有,我觉得可能没有这个参数设置。
地址是:https://github.com/sumatrapdfreader/sumatrapdf/wiki/Command-line-arguments
你的修改方法能让我看看么,链接打来404了。。。。
因为最新版的SumatraPDF已经支持双面打印了,所以我把我的代码删除了。你可以参考下面的代码。其中,参数duplex表示双面打印。数字+X表示打印多少份。如:3x表示打印3份。
https://github.com/sumatrapdfreader/sumatrapdf/blob/master/src/Print.cpp#L719-L726
恩,这个代码我也看到了。也知道可以双面打印,但是不能一份一份的打印,这样奇数页最后一页就会打印在一张纸上。就卡在逐份打印上了。
应该是你打印机的问题吧,我刚用自己的打印机试了,参数是"2x,duplex",好像没打印到前一页上啊。
如果实在不行的话,那就一次打印一份,多打印几次不就行了。
看过文档了,没有看到有用的参数。不过还是谢谢你
学习一下 还算不错
很好用,帮了我个大忙
收藏下,改天或许用得到