最新消息:发现真没时间折腾VPS,最近又换了个空间。呵呵

用SumatraPdf实现PDF静默打印

之前做一系统,有一个打印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 水平双面(两面的上下方向一样);
  • duplexduplexlong 垂直双面(两面的上下方向不同);
  • simplex 单面(默认)

打印份数:

  • nx 打印n份
  • 没有设置为打印1份

比如: 以水平双面无边框打印偶数页2份,其设置为 even,noscale,duplex,2x

SumatraPdf 下载地址

http://www.sumatrapdfreader.org/download-free-pdf-viewer-cn.html

转载请注明:宇托的狗窝 » 用SumatraPdf实现PDF静默打印

发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (12)

  1. 刚刚留言找错了地方,这个自动分页的参数是什么呢?谢谢
    Andy哥2016-01-15 17:09:55回复
    • PDF没有自动分页吧,生成PDF时就已经固定页面了啊。
      宇托2016-01-21 15:23:01回复
      • 打印多份PDF时候的自动分页,SumatraPDF打印弹出框有一个checkBox,叫做自动分页。我想知道这个参数怎么设置
        Andy哥2016-01-21 16:24:43回复
        • 实在对不起,好久都没看SumatraPDF的程序了,我也不太了解,你去看看它的文档,看看里面是不是有,我觉得可能没有这个参数设置。
          地址是:https://github.com/sumatrapdfreader/sumatrapdf/wiki/Command-line-arguments
          宇托2016-01-24 23:15:02回复
          • 看过文档了,没有看到有用的参数。不过还是谢谢你
            Andy哥2016-01-25 12:09:40回复
          • 你的修改方法能让我看看么,链接打来404了。。。。
            Andy哥2016-01-25 14:06:05回复
            • 因为最新版的SumatraPDF已经支持双面打印了,所以我把我的代码删除了。你可以参考下面的代码。其中,参数duplex表示双面打印。数字+X表示打印多少份。如:3x表示打印3份。
              https://github.com/sumatrapdfreader/sumatrapdf/blob/master/src/Print.cpp#L719-L726
              宇托2016-01-25 14:20:18回复
              • 恩,这个代码我也看到了。也知道可以双面打印,但是不能一份一份的打印,这样奇数页最后一页就会打印在一张纸上。就卡在逐份打印上了。
                Andy哥2016-01-25 15:16:57回复
                • 应该是你打印机的问题吧,我刚用自己的打印机试了,参数是"2x,duplex",好像没打印到前一页上啊。
                  如果实在不行的话,那就一次打印一份,多打印几次不就行了。
                  宇托2016-01-25 16:09:03回复
  2. 学习一下 还算不错
    网赚论坛2014-12-12 15:18:58回复
  3. 很好用,帮了我个大忙
    chenguangxing2014-04-14 17:16:52回复
  4. 收藏下,改天或许用得到
    动漫那点事2014-03-04 17:12:08回复