使用 Ghostscript 打印时页面裁剪和旋转不正确

Posted

技术标签:

【中文标题】使用 Ghostscript 打印时页面裁剪和旋转不正确【英文标题】:Page cropped and rotated incorrectly when printing with Ghostscript 【发布时间】:2018-03-05 06:58:53 【问题描述】:

我一直在尝试从命令行(hostscript 版本 9.22)或使用 ghostscript.net(版本 1.2.1)的 .NET 控制台应用程序打印一页 pdf 文件。该文件(PDF 版本 1.7 - Acrobat 8​​.x)为 A3 大小,我想在 A4 上打印。看起来像这样: 我正在使用的开关

-empty -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -dNumCopies=1 -sDEVICE=mswinpr2 -sOutputFile=%printer%MSPrintToPDF -f d:\test.pdf

(不同的pdf(primopdf、dopdf8、microsoft pdf打印机)和真实打印机)

开关,不同的组合,我试过了:

-sPaperSize=a4 -g2490x1000 -dFIXEDMEDIA -dFIXEDRESOLUTION -r300 -dAutoRotatePages -dfitpage -dPDFFitPage -dEPSFitPage -dDEVICEWIDTHPOINTS=3500 -dDEVICEHEIGHTPOINTS=2000 -dORIENT1=假 -dORIENT1=true

没有这个:

-dDEVICEWIDTHPOINTS=3500 -dDEVICEHEIGHTPOINTS=2000

结果被裁剪且未正确旋转:

否则结果是横向,但仍被裁剪:

如何在适合页面的 A4 上打印 A3 大小的 PDF?

谢谢

【问题讨论】:

【参考方案1】:

您设置的大多数控件对渲染设备没有影响,或者对 mswinpr2 设备没有影响。

mswinpr2 设备主要由 Windows 控制。发生的情况是通过查询打印机的默认配置来确定介质尺寸和分辨率,除非您允许弹出打印对话框,在这种情况下您输入的配置将是使用的配置.

Tha 创建一个 Windows 打印机设备上下文。然后将输入文件呈现为位图,并将该位图绘制到设备上下文中。最后,设备上下文被告知打印自己。

所有这一切的结果是,基本上,你试图做的事情根本行不通。您使用的控件会被打印机的配置覆盖,因此不会发生缩放。

我通常不会建议这样做,但在这种情况下,您最好的解决方案是通过 ps2write 或 pdfwrite 设备(或在即将发布的 9.23 版本中的 pdfimage 设备之一)运行原始文件。在该输出文件中获取正确的大小、方向和缩放比例(您可能会发现 PDF 最容易检查。然后获取 那个 修改后的 PDF 文件并通过 mswinpr2 设备打印。

【讨论】:

我应该在 pdfwrite 设备上使用哪些开关?我无法输出 A4【参考方案2】:

@KenS 建议的我的解决方案:

    string printerName = "hp";
    string inputFile = @"d:\test.pdf";
    string tempFilePath = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".tmp.pdf";
    List<string> switches = new List<string>();
    switches.Add(string.Empty);
    switches.Add("-dNOPAUSE");
    switches.Add("-dBATCH");
    switches.Add("-sDEVICE=pdfwrite");
    switches.Add("-dSAFER");
    switches.Add("-dCompatibilityLevel=1.5");
    switches.Add("-dColorConversionStrategy=/LeaveColorUnchanged");
    switches.Add("-dSubsetFonts=true");
    switches.Add("-dEmbedAllFonts=true");
    switches.Add("-sDEFAULTPAPERSIZE=a4");
    switches.Add("-sPAPERSIZE=a4");
    switches.Add("-dAutoRotatePages=/PageByPage");
    switches.Add("-dFIXEDMEDIA");
    switches.Add("-dPDFFitPage");
    switches.Add($"-sOutputFile=tempFilePath");
    switches.Add("-c");
    switches.Add("-f");
    switches.Add(inputFile);

    processor.StartProcessing(switches.ToArray(), null);
    switches = new List<string>();
    switches.Add("-dPrinted");
    switches.Add("-dBATCH");
    switches.Add("-dNOPAUSE");
    switches.Add("-dNOSAFER");
    switches.Add("-dNumCopies=1");
    switches.Add("-sDEVICE=mswinpr2");
    switches.Add("-sOutputFile=%printer%" + printerName);
    switches.Add("-sDEFAULTPAPERSIZE=a4");
    switches.Add("-sPAPERSIZE=a4");
    switches.Add("-dFIXEDMEDIA");
    switches.Add("-dPDFFitPage");
    switches.Add("-q");
    switches.Add("-f");
    switches.Add(tempFilePath);
    processor.StartProcessing(switches.ToArray(), null);

【讨论】:

以上是关于使用 Ghostscript 打印时页面裁剪和旋转不正确的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有页面特定裁剪框数组的 ghostscript 裁剪多页 pdf

GHOSTSCRIPT - PS 到 PDF 转换纸张大小

如何使用 ghostscript 在多页 pdf 中裁剪第 3 和第 4 页

Ghostscript - 打印到 pdf 时剪裁页面的右侧

Ghostscript /crop box在Linux中无法正确打印

奇怪的问题,ghostscript 和 pdf 文件