使用 Ghostscript 打印时页面被错误裁剪和旋转
Page cropped and rotated incorrectly when printing with Ghostscript
我一直在尝试从命令行(主机脚本版本 9.22)或使用 ghostscript.net (version 1.2.1). The file (PDF version 1.7 - Acrobat 8.x) is A3 size and I want to print it on an A4. It looks like this: 的 .NET 控制台应用程序打印 one-page pdf 文件
我使用的开关
-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=true
没有这个:
-dDEVICEWIDTHPOINTS=3500 -dDEVICEHEIGHTPOINTS=2000
结果被裁剪且未正确旋转:
否则结果是横向的,尽管仍然被裁剪:
如何在适合页面的 A4 上打印 A3 大小的 PDF?
谢谢
您设置的大多数控件对渲染设备没有影响,或者对 mswinpr2 设备没有影响。
mswinpr2 设备主要由Windows 控制。发生的情况是,介质尺寸和分辨率是通过查询打印机的 default 配置来确定的,除非您允许弹出打印对话框,在这种情况下,您输入的配置将是使用的那个。
Tha 创建了一个 Windows 打印机设备上下文。然后将输入文件呈现为位图,并将该位图绘制到设备上下文。最后,设备上下文被告知打印自己。
所有这一切的结果是,基本上,您尝试做的事情根本行不通。您正在使用的控件已被打印机的配置覆盖,因此不会发生缩放。
我通常不会建议这样做,但在这种情况下,您最好的解决方案是 运行 通过 ps2write 或 pdfwrite 设备(或即将发布的 9.23 版本中的一种 pdfimage 设备)的原始文件.在该输出文件中获得正确的大小、方向和缩放比例(您可能会发现 PDF 最容易检查。然后获取 那个 修改过的 PDF 文件并通过 mswinpr2 设备打印它。
@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);
我一直在尝试从命令行(主机脚本版本 9.22)或使用 ghostscript.net (version 1.2.1). The file (PDF version 1.7 - Acrobat 8.x) is A3 size and I want to print it on an A4. It looks like this:
-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=true
没有这个:
-dDEVICEWIDTHPOINTS=3500 -dDEVICEHEIGHTPOINTS=2000
结果被裁剪且未正确旋转:
否则结果是横向的,尽管仍然被裁剪:
如何在适合页面的 A4 上打印 A3 大小的 PDF?
谢谢
您设置的大多数控件对渲染设备没有影响,或者对 mswinpr2 设备没有影响。
mswinpr2 设备主要由Windows 控制。发生的情况是,介质尺寸和分辨率是通过查询打印机的 default 配置来确定的,除非您允许弹出打印对话框,在这种情况下,您输入的配置将是使用的那个。
Tha 创建了一个 Windows 打印机设备上下文。然后将输入文件呈现为位图,并将该位图绘制到设备上下文。最后,设备上下文被告知打印自己。
所有这一切的结果是,基本上,您尝试做的事情根本行不通。您正在使用的控件已被打印机的配置覆盖,因此不会发生缩放。
我通常不会建议这样做,但在这种情况下,您最好的解决方案是 运行 通过 ps2write 或 pdfwrite 设备(或即将发布的 9.23 版本中的一种 pdfimage 设备)的原始文件.在该输出文件中获得正确的大小、方向和缩放比例(您可能会发现 PDF 最容易检查。然后获取 那个 修改过的 PDF 文件并通过 mswinpr2 设备打印它。
@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);