我从pdfs创建prn代码并使用C#代码将它们发送到打印机以自动化打印作业。为此,我使用带有以下参数的ghost脚本。
gswin32c -dNOPAUSE -dBATCH -sDEVICE=laserjet -sOutputFile="c:/temp/out.prn" "NumberedPages.pdf"
此命令行参数生成名为out.prn的prn文件。当我使用以下C#代码将此文件发送到打印机时,它会成功打印pdf文件。
public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, Int32 dwCount)
{
uint returnedValue = 0;
Int32 dwError = 0, dwWritten = 0;
IntPtr hPrinter = new IntPtr(0);
DOCINFOA di = new DOCINFOA();
bool bSuccess = false; // Assume failure unless you specifically succeed.
di.pDocName = "My C#.NET RAW Document";
di.pDataType = "RAW";
// Open the printer.
if (OpenPrinter(szPrinterName.Normalize(), out hPrinter, IntPtr.Zero))
{
// Start a document.
returnedValue = StartDocPrinter(hPrinter, 1, di);
if (0 != returnedValue)
{
// Start a page.
if (StartPagePrinter(hPrinter))
{
// Write your bytes.
bSuccess = WritePrinter(hPrinter, pBytes, dwCount, out dwWritten);
EndPagePrinter(hPrinter);
}
EndDocPrinter(hPrinter);
}
ClosePrinter(hPrinter);
}
// If you did not succeed, GetLastError may give more information
// about why not.
if (bSuccess == false)
{
dwError = Marshal.GetLastWin32Error();
}
return bSuccess;
}
(https://stackoverflow.com/a/29564132/3079364)
如果打印机成功打印了打印作业,我也想监视打印作业。但是由ghost脚本生成的prn文件并不反映正确的页数。见下文
从CZ打印作业跟踪器中捕获
当我使用Word或Adobe打印此文档时,CZ打印作业跟踪器显示正确的页数。
是否有任何参数可以添加到ghost脚本命令以更正此信息?
答案 0 :(得分:2)
输出文件只是一个PCL文件,因为这是激光喷射设备所理解的。这不包含有关文件中页数的任何信息。
打印后台处理程序认为只有一页的原因是因为您没有以不同的方式告诉它。您已经打开了一个文件,启动了一个页面,并将内容直接写入了打印机,如果您没有告诉它每个开始和停止的位置,假脱机程序无法知道该流包含的页数。
你调用StartPagePrinter一次,所以打印假脱机程序(不合理)假设只有一页。如果为每个页面调用一次StartPagePrinter和EndPagePrinter,那么您将获得正确的页数。当然,这意味着要知道每个页面的开头和结尾在Ghostscript输出的文件中,你不知道。
您最好的选择是使用%d格式的OutputFile每页生成一个文件,然后页面计数将是正确的。
当您将数据直接发送到打印机时,似乎没有任何方法可以告诉打印后台处理程序有多少页。我觉得这并不奇怪,因为打印后台处理器并没有真正参与其中。