我需要你支持以下问题,因为它拉了我一段时间。我们有一个小c#
实用程序,使用PDF
打印GhostScript
。此打印按预期方式但无法保留页面格式。但是,当我切换Adobe Acrobat
代替GhostScript
时,页面会按预期打印。所以我认为,我在GhostScript的命令行参数上犯了一些明显的错误。
背景
以下是核心c#逻辑,它在每个页面上打印不同风格的给定PDF文件。给定的PDF文件有页面;
简明扼要地说,我试图打印的PDF只是一个整合(将个人pdf加入一个大型pdf)的大量小尺寸pdf文档,具有不同的字体样式,大小,边距。
问题
遵循逻辑使用GhostScript(v9.02)
打印PDF文件。虽然以下逻辑打印任何给定的PDF,但它无法保留页面格式,包括页眉,页脚,字体大小,边距,方向(我的pdf文件包含横向和纵向页面)。
有趣的是,如果我使用acrobat reader打印相同的PDF,那么它将按预期打印以及所有页面级格式化。
PDF标本:First section,Second section
void PrintDocument()
{
var psInfo = new ProcessStartInfo();
psInfo.Arguments =
String.Format(
" -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies=1 -sDEVICE=ljet4 -sOutputFile=\"\\\\spool\\{0}\" \"{1}\"",
GetDefaultPrinter(), @"C:\PDFOutput\test.pdf");
psInfo.FileName = @"C:\Program Files\gs\gs9.10\bin\gswin64c.exe";
psInfo.UseShellExecute = false;
using (var process= Process.Start(psInfo))
{
process.WaitForExit();
}
}
答案 0 :(得分:2)
我认为您之前已经问过这个问题,并且您的代码示例中也很清楚您使用的是 GSView ,而不是 Ghostscript 。
现在,虽然GSView确实使用Ghostscript来完成繁重工作,但是您无法区分这两个应用程序。
您仍然没有提供要查看的示例PDF文件,也没有提供命令行,尽管您现在至少设法引用了Ghostscript版本。你还需要提供一个命令行(不是我不准备通过阅读你的代码来组装它)你应该从命令行尝试这个,而不是在你自己的应用程序中,以显示它不是你的应用程序错误。
您应该考虑将Ghostscript升级到当前版本。
请注意,快速阅读代码表明您指定了许多命令行选项(例如-dPDFSETTINGS),这些选项仅适用于将文件转换为PDF,而不是用于任何其他目的(例如打印)。 / p>
正如我之前所说,提供一个样本文件来重现问题,以及一个导致问题的命令行(最好是 Ghostscript 命令行)。知道你正在使用哪台打印机也可能有用,虽然我不太可能有重复测试。
答案 1 :(得分:2)
答案 - 更新日期16/12/2013
我成功地解决了这个问题,如果能够帮助其他人,我希望附上工作解决方案。特别感谢'KenS',因为他花了很多时间来指导我。
总而言之,我最终决定使用GSView和GhostScript来打印PDF以绕过Adobe。核心逻辑如下:
//PrintParamter is a custom data structure to capture file related info
private void PrintDocument(PrintParamter fs, string printerName = null)
{
if (!File.Exists(fs.FullyQualifiedName)) return;
var filename = fs.FullyQualifiedName ?? string.Empty;
printerName = printerName ?? GetDefaultPrinter(); //get your printer here
var processArgs = string.Format("-dAutoRotatePages=/All -dNOPAUSE -dBATCH -sPAPERSIZE=a4 -dFIXEDMEDIA -dPDFFitPage -dEmbedAllFonts=true -dSubsetFonts=true -dPDFSETTINGS=/prepress -dNOPLATFONTS -sFONTPATH=\"C:\\Program Files\\gs\\gs9.10\\fonts\" -noquery -dNumCopies=1 -all -colour -printer \"{0}\" \"{1}\"", printerName, filename);
try
{
var gsProcessInfo = new ProcessStartInfo
{
WindowStyle = ProcessWindowStyle.Hidden,
FileName = gsViewEXEInstallationLocation,
Arguments = processArgs
};
using (var gsProcess = Process.Start(gsProcessInfo))
{
gsProcess.WaitForExit();
}
}
答案 2 :(得分:2)
您可以使用GSPRINT。
我设法通过仅在目录中复制gsprint.exe / gswin64c.exe / gsdll64.dll并从那里启动它来使其工作。
示例代码:
// This uses gsprint (mind the paths)
private const string gsPrintExecutable = @"C:\gs\gsprint.exe";
private const string gsExecutable = @"C:\gs\gswin64c.exe";
string pdfPath = @"C:\myShinyPDF.PDF"
string printerName = "MY PRINTER";
string processArgs = string.Format("-ghostscript \"{0}\" -copies=1 -all -printer \"{1}\" \"{2}\"", gsExecutable, printerName, pdfPath );
var gsProcessInfo = new ProcessStartInfo
{
WindowStyle = ProcessWindowStyle.Hidden,
FileName = gsPrintExecutable ,
Arguments = processArgs
};
using (var gsProcess = Process.Start(gsProcessInfo))
{
gsProcess.WaitForExit();
}
答案 3 :(得分:0)
在 Process.Start()
中尝试以下命令:
gswin32c.exe -sDEVICE=mswinpr2 -dBATCH -dNOPAUSE -dNOPROMPT -dNoCancel -dPDFFitPage -sOutputFile="%printer%\\[printer_servername]\[printername]" "[filepath_to_pdf]"
在 C# 中应该是这样的:
string strCmdText = "gswin32c.exe -sDEVICE=mswinpr2 -dBATCH -dNOPAUSE -dNOPROMPT -dNoCancel -dPDFFitPage -sOutputFile=\"%printer%\\\\[printer_servername]\\[printername]\" \"[filepath_to_pdf]\"";
System.Diagnostics.Process.Start("CMD.exe", strCmdText);
这会将指定的 PDF 文件放入打印队列。
注意- 您的 gswin32c.exe 必须与您的 C# 程序位于同一目录中。我还没有测试过这段代码。