You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

通过调用Windows进程执行命令实现PDF按指定页面尺寸打印——C#实现

关于Adobe Acrobat Reader DC打印PDF时指定页面尺寸的问题

很遗憾,Adobe Acrobat Reader DC的命令行参数中并没有支持直接指定打印页面尺寸的选项——你尝试添加的/PageSize "Envelope C5"这类参数,Reader根本不会识别,所以这种方式行不通。

为什么会这样?

Reader的命令行打印参数(比如你用的/t(打印到指定打印机)、/h(隐藏Reader窗口))只负责触发打印动作,打印时的页面尺寸等细节,默认会遵循三个优先级:

  1. PDF文件本身内嵌的页面设置
  2. 目标打印机的默认纸张配置
  3. 系统打印对话框里的临时设置(但你用CreateNoWindow=true会跳过对话框)

所以如果想强制用C5信封尺寸打印,得换其他方案:


方案1:临时修改打印机的默认纸张尺寸

你可以通过C#的System.Printing命名空间,临时把目标打印机的默认纸张改成C5,打印完成后再恢复原来的设置。示例代码大概是这样:

using System.Printing;

// 获取目标打印机
var printerName = "My Printer Name";
var printServer = new LocalPrintServer();
var printQueue = printServer.GetPrintQueue(printerName);

// 保存原默认打印票证
var originalTicket = printQueue.DefaultPrintTicket.Clone();

try
{
    // 创建新的打印票证,设置C5信封尺寸
    var newTicket = printQueue.DefaultPrintTicket.Clone();
    newTicket.PageMediaSize = new PageMediaSize(PageMediaSizeName.EnvelopeC5);
    printQueue.DefaultPrintTicket = newTicket;
    printQueue.Commit();

    // 执行你的打印进程
    Process p = new Process();
    p.StartInfo = new ProcessStartInfo() 
    { 
        CreateNoWindow = true, 
        Verb = "print", 
        Arguments = String.Format("/h /t \"{0}\" \"{1}\"", "MyFile.pdf", printerName) 
    };
    p.Start();
    p.WaitForExit();
}
finally
{
    // 恢复原默认设置
    printQueue.DefaultPrintTicket = originalTicket;
    printQueue.Commit();
}

注意:这个方法需要程序有足够的权限修改打印机设置,而且要处理可能的异常(比如打印机不存在、不支持C5尺寸)。


方案2:使用Adobe Acrobat COM接口(仅完整版Acrobat)

如果你使用的是Adobe Acrobat Pro(不是免费的Reader),可以通过COM对象直接控制打印参数,包括指定页面尺寸。示例思路:

// 需要添加对Adobe Acrobat类型库的引用
AcroPDDoc pdfDoc = new AcroPDDoc();
if (pdfDoc.Open("MyFile.pdf"))
{
    // 设置打印参数,指定C5信封
    var printParams = pdfDoc.GetPrintParams();
    // 这里需要根据Acrobat的API设置纸张尺寸,具体参数需要查官方文档
    printParams.PaperSize = ...; // 对应C5的枚举值
    pdfDoc.PrintPages(0, pdfDoc.GetNumPages() - 1, 1, false, printParams);
    pdfDoc.Close();
}

但Reader没有这个COM接口,所以这个方案只适用于完整版Acrobat。


方案3:用第三方命令行打印工具(比如Ghostscript)

如果不想依赖Adobe的软件,可以用Ghostscript这类开源工具,它支持通过命令行直接指定纸张尺寸。比如:

gswin64c.exe -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=mswinpr2 -sOutputFile="%printer%My Printer Name" -sPAPERSIZE=c5 "MyFile.pdf"

在C#里调用这个命令即可,灵活性更高,能直接控制打印的各种参数。


内容的提问来源于stack exchange,提问作者Kelechi Daniels

火山引擎 最新活动