我必须为我们公司生产的产品打印运输标签。
为了让我自己了解这些标签的结果,我使用Windows窗体进行设计。这允许我使用Label
控件定位文本,设置正确的字体等,添加自定义BarCode
控件,并使用{{1获取“ fancy ”控件将项目分组到框中。
每个页面都有两(2)个标签。
当我的代码打印标签文档时,我要求2,4或6份副本。有时,也会使用“打印预览”。在这种情况下,我必须重置创建的标签数量。
然而,当文件打印时:
有没有人看到模式?我没有。
这是我的打印命令:
Panel
我必须编写一个自定义的PrintPreview类,它将public int Print(string docName, int rows, int columns, int copies) {
short shortCopies = (short)copies;
LabelsHorizontal = rows;
LabelsVertical = columns;
Size docSize = PrintPreview.Document.DefaultPageSettings.Bounds.Size;
float height = 0.8F * Screen.PrimaryScreen.WorkingArea.Size.Height;
float width = (height * docSize.Width) / docSize.Height;
Size winSize = new Size((int)width, (int)height);
PrintPreview.Height = winSize.Height;
PrintPreview.Width = winSize.Width;
if (!String.IsNullOrEmpty(docName)) {
PrintPreview.Document.DocumentName = docName;
}
PrintPreview.Document.PrinterSettings.Copies = shortCopies;
PrintPreview.SettingsFilename = Settings.PageSettingsLocation;
if (!PrintPreview.PrinterSelected) {
if (PrintPreview.ShowPrinterSelectDialog() != DialogResult.OK) {
return 0;
}
}
labelQtyPrinted = 0;
if (ShowPrintPreview) {
PrintPreview.ShowDialog();
} else {
PrintPreview.PrintDocument();
}
return labelQtyPrinted;
}
// Resets the Label Count between PrintPreview and Print
private void PrintPreview_OnPrintClicked(object sender, EventArgs e) {
labelQtyPrinted = 0;
}
作为基类,以便我可以使用 printButton_Click 方法覆盖其Print按钮:
PrintPreviewDialog
在// Handles the Printing of the Document
internal void printButton_Click(object sender, EventArgs e) {
if (OnPrintClicked != null) {
OnPrintClicked(sender, e); // this resets my labelQtyPrinted value shown above
}
Document.Print();
printed = true;
Close();
}
方法(第一段代码)中,Print
只是调用PrintPreview.PrintDocument()
事件的代码。
我的 PrintPageEventHandler 如下所示:
printButton_Click
总而言之,它运作良好。 “Run Away Printer”永远不会抛出异常。
那么,为什么要制作这么多副本?
打印机是HP LaserJet 4050,如果这有任何区别的话。
答案 0 :(得分:3)
我知道了!
开心辞典!
好的,如果有人关心,这是交易:我需要每页打印两(2)个标签。
我需要做的是使用垂直和水平打印的标签数量来计算要打印的页数。
我添加了变量labelsRequested
并将现有变量labelQtyPrinted
更改为labelsPrinted
:
private int labelsPrinted;
private int labelsRequested;
我的公开Print
方法更改为:
public int Print(string docName, int rows, int columns, int copies) {
LabelsHorizontal = rows;
LabelsVertical = columns;
if (!String.IsNullOrEmpty(docName)) {
PrintPreview.Document.DocumentName = docName;
}
labelsRequested = copies;
//PrintPreview.Document.PrinterSettings.Copies = (short)copies;
PrintPreview.SettingsFilename = Settings.PageSettingsLocation;
if (!PrintPreview.PrinterSelected) {
if (PrintPreview.ShowPrinterSelectDialog() != DialogResult.OK) {
return 0;
}
}
if (ShowPrintPreview) {
Size docSize = PrintPreview.Document.DefaultPageSettings.Bounds.Size;
float height = 0.8F * Screen.PrimaryScreen.WorkingArea.Size.Height;
float width = (height * docSize.Width) / docSize.Height;
Size winSize = new Size((int)width, (int)height);
PrintPreview.Height = winSize.Height;
PrintPreview.Width = winSize.Width;
PrintPreview.Document.PrinterSettings.Copies = (short)labelsRequested; // this may cause problems
PrintPreview.ShowDialog();
} else {
PrintPreview.PrintDocument();
}
return labelsPrinted;
}
现在,我没有像以前那样添加print_Click
事件处理程序,而是将Document
的{{1}}和BeginPrint
连接起来,如下所示:
EndPrint
但是,这里的关键显然来自于我尝试在void Document_BeginPrint(object sender, PrintEventArgs e) {
labelsPrinted = 0;
float fPerPage = LabelsHorizontal * LabelsVertical;
if (1 < fPerPage) {
float fQty = labelsRequested;
float fTotal = fQty / fPerPage;
PrintPreview.Document.PrinterSettings.Copies = (short)fTotal;
}
}
void Document_EndPrint(object sender, PrintEventArgs e) {
Printed = (labelsPrinted == labelsRequested);
}
事件处理程序中设置HasMorePages
值。
“为什么?”你问。因为我只打印了相同的1页大小的文档的多个副本。 如果 我的一个文档要跨越多个页面,那么我需要确保PrintPage
已设置。
不用多说,这是我的HasMorePages
事件处理程序(请注意,很多代码都非常通用,可以轻松编辑以适用于其他代码):
PrintPage