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

时间:2018-03-05 06:58:53

标签: ghostscript ghostscript.net

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

  

-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 = FALSE   -dORIENT1 =真

没有这个:

  

-dDEVICEWIDTHPOINTS = 3500 -dDEVICEHEIGHTPOINTS = 2000

结果被裁剪并且没有正确旋转:

enter image description here

否则结果是横向的,但仍会被裁剪: enter image description here

如何在适合页面的A4上打印A3尺寸的PDF?

谢谢

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分:0)

我的解决方案,由@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);