Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以安排打印机逐页打印_C#_Printdocument - Fatal编程技术网

C# 是否可以安排打印机逐页打印

C# 是否可以安排打印机逐页打印,c#,printdocument,C#,Printdocument,我有一个A3大小的打印文档,其中包含客户提供的图像,它将通过计算填充文档(有时一次计算到打印文档的图像可能超过300个)。我现在面临的问题是,当它被发送到打印机时,文档太大,打印机内存无法处理。有没有一种方法可以让打印机在发送页面时立即打印页面,而不是打印整个文档?我的同事建议将这些页面拆分为不同的文档。可能吗 我已经浏览了文档,似乎printDocument或printerController无法与打印机对话,以便在收到页面后立即开始打印页面 在我的测试运行中,我有一个将360个图像塞进28页

我有一个A3大小的打印文档,其中包含客户提供的图像,它将通过计算填充文档(有时一次计算到打印文档的图像可能超过300个)。我现在面临的问题是,当它被发送到打印机时,文档太大,打印机内存无法处理。有没有一种方法可以让打印机在发送页面时立即打印页面,而不是打印整个文档?我的同事建议将这些页面拆分为不同的文档。可能吗

我已经浏览了文档,似乎printDocument或printerController无法与打印机对话,以便在收到页面后立即开始打印页面

在我的测试运行中,我有一个将360个图像塞进28页的工作,文档假脱机数据增加到了2.71GB

private void PrintPageEventHandler(对象发送方,PrintPageEventArgs e)
{
//设置一些设置
//循环,直到页面被图像填满
同时(计数器<每页允许的最大值)
{
e、 Graphics.DrawImage(图像,currentPoint.X+posX,currentPoint.Y+
posY、newWidth、newHeight);
}
e、 Graphics.Dispose();
e、 HasMorePages=(PrintedImageCount!=TotalImageCount);
}
好的基于Microsoft for PrintDocument,您只需移动循环即可

大概是

while(counter < maxImageAllowedPerPage)
{
    PrintDocument pd = new PrintDocument();
    pd.PrintPage += new PrintPageEventHandler(this.PrintPageEventHandler);
    pd.Print();
}
while(计数器
不确定如何确定要打印哪个
图像
,但在这个循环中也需要这样做,可能在最后的
print()
之前,因为这将触发事件处理程序。可能您需要两个“图像”集合,一个是完整的图像集合,另一个是为每个页面填充的集合,因此您将在上面的循环中填充第二个集合,PrintPage EV将从该集合中读取


哦,HasMorePages现在永远都是假的。

我得到了类似于@cjb110的答案

//initialize the print docuemnts with all settings required
var printDocument = new PrintDocument();
printDocument.PrintedImageCount = 0;
printDocument.TotalImageCount = 150;

while(printDocument.PrintedImageCount != printDocument.TotalImageCount){
    printDocument.Print();
}

到目前为止,打印机能够处理发送到打印机的测试打印30个文档而不会崩溃,我的客户端将自行监控打印机在崩溃之前可以接受多少文档,以查看是否需要实施限制以防止一次发送过多文档


感谢所有建议不同解决方案的人。

您超出了打印缓冲区的大小。您可以通过直接写入打印机IP地址来绕过缓冲区。是的,我同意您的同事的看法,它似乎不是一个多页面的文档,而是多页面的文档,因此每次“页面”满时创建一个新文档非常有意义(另外,您可以将这些文档保存起来以便以后打印)。您现在正在创建一个文档,但如果您需要进一步帮助,请添加一些打印代码。@jdweng如果您对打印机的寻址方式不变,打印机仍然需要缓冲整个文档,因为它必须将其转换为本机命令/逻辑。因为我以前做过很多次。您要做的是添加一台新打印机,但不是选择用作打印服务器的PC名称,而是使用“在打印机设置中”选项来使用打印机的IP地址。@cjb110我已经添加了在PrntPageEventHandler期间生成文档的方式不确定这是否足够谢谢您的解决方案是的,我重新编写了代码以查看一些内容与此类似,哈哈,我现在唯一担心的是打印队列溢出,但我始终可以添加一个Thread.sleep()以确保上一个打印作业已完成。谢谢你的解决方案:D
//initialize the print docuemnts with all settings required
var printDocument = new PrintDocument();
printDocument.PrintedImageCount = 0;
printDocument.TotalImageCount = 150;

while(printDocument.PrintedImageCount != printDocument.TotalImageCount){
    printDocument.Print();
}