Tag: 打印

以高品质打印winform?

我是编写代码的新手,但我正在学习C#并正在为我的商店制作一个小账单制作程序。 我需要打印表格,这是我的账单。 通过在互联网上搜索,我找到了这段代码: printForm1.Print(this, PrintForm.PrintOption.ClientAreaOnly); 我的结算表单有两个图片和一个gridviewbox 。 此代码可以打印帐单,但.xps文件的质量很差 – 即使文本打印不清晰。 如何提高表格的打印质量?

如何使RawPrinterHelper在XPS_PATH和RAW数据类型中都有效?

我正在使用RawPrinterHelper进行打印。 它适用于Windows 7和以前的版本。 当我们使用安装在Windows 8 pc上的打印机进行尝试时,它无效。 阅读这篇文章后,我了解到我必须将dataType变量设置为“XPS_PASS”而不是“RAW”。 顺便说一下,将它设置为“XPS_PASS”在Windows 8上运行正常。 但在我的环境中,还有Windows 8s和Windows 7s以及XP。 是否可以通过编程方式进行此切换? 如何为Windows 7和更低版本的操作系统将pDataType变量设置为“RAW”,如何将“XPS_PASS”设置为Windows 8? 编辑:经过几个小时挖谷歌我发现这篇文章。 这里说: 调用GetPrinterDriver以检索DRIVER_INFO_8结构。 检查PRINTER_DRIVER_XPS标志的DRIVER_INFO_8 :: dwPrinterDriverAttributes。 根据是否存在标志选择数据类型: 如果设置了标志,请使用’XPS_PASS’ 如果未设置标志,请使用’RAW’ 我不熟悉非托管代码,但我尝试了以下代码: [DllImport(“winspool.drv”, CharSet = CharSet.Auto, SetLastError = true)] public static extern int GetPrinterDriver(IntPtr hPrinter, string pEnvironment, uint Level, IntPtr pDriverInfo, int cbBuf, out int pcbNeeded); private static void GetPrinterDataType(IntPtr hPrinter […]

以高于屏幕分辨率的dpi打印表格

问题: 我们需要帮助来了解如何使用WinForms自动扩展到不同DPI的能力,以允许我们以600dpi而不是屏幕DPI打印我们的表单。 对于你所看到的是什么 – 你得到的打印,我们一直在简单地采用我们精心布置的窗口并打印它(关闭滚动条和按钮等)。 除了一件事之外,它的效果非常好:它出现在96dpi或120dpi(无论屏幕分辨率如何)……其中任何一个都看起来有颗粒感和不专业(我们的客户都在抱怨)。 虽然它与屏幕上的内容一样可读,但您希望打印的文档比屏幕上的内容更具可读性…您希望能够看到更多细节,以便能够阅读较小的文本等。 考虑的替代方案: 鉴于我们的自动缩放工作效果很好,这样我们的窗口在96dpi,120dpi,144 dpi等方面看起来很好,我们希望我们可以在600dpi下绘制窗口,然后打印出来。 或者,我们看到屏幕上的窗口比正常情况下大5-6倍,这样我们就可以像600dpi那样拥有相同的像素数,但是在96或120 dpi ……然后将那个巨大的窗口绘制到300或600的打印页面dpi(无论打印机是什么)。 如果你能告诉我们如何做其中任何一种选择,或者如果你能给我们一个不同的方式来实现我们的目标,那么我们将非常感激它。 当前代码: 如果它很重要,我们的Form包含一个FlowLayoutPanel,它将其他较小的FlowLayoutPanel放入列中,那些较小的FlowLayoutPanels放置一列TextBoxes,RichTextBoxes,第三方RichTextEditor,PictureBoxes和DataGridViews。 我们使用从PrintDocument派生的类来实现OnBeginPrint,OnPrintPage和OnEndPrint。 在OnPrintPage中,它在屏幕外(实际屏幕的右下方)操作我们的普通窗口以适合页面大小,然后请求我们的主面板(顶部FlowLayoutPanel)到DrawToBitmap,然后使用传递给PrintEventArgs的Graphics对象来绘制DrawImage那个位图。 我们还使用Graphics.DrawString将页脚应用于每个页面。 主要代码: using (Bitmap bm = new Bitmap(sz.Width, sz.Height)) { Rectangle rect = new Rectangle(0, 0, sz.Width, sz.Height); mp.DrawToBitmap(bm, rect); e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; // so footer is anti-aliased e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; // so when we scale up, […]

WPF中的PrintDialog.PrinterSettings等价物

我正在尝试为我正在编写的C#WPF应用程序添加打印支持,而我正在为此撕裂我的头发。 我正在尝试从WPF应用程序中的窗口打印单个图像。 该图像是运输标签,打印机是热敏打印机,装有4“x6”运输标签库存。 要打印的代码如下: PrintDialog pd = new PrintDialog(); if (pd.ShowDialog() == true) { Image tmpImage = new Image(); tmpImage.Stretch = Stretch.Uniform; tmpImage.Width = pd.PrintableAreaWidth; tmpImage.Source = this.img_label.Source; tmpImage.Measure(new Size(pd.PrintableAreaWidth, pd.PrintableAreaHeight)); tmpImage.Arrange(new Rect(new Point(0, 0), tmpImage.DesiredSize)); pd.PrintVisual(tmpImage, “Shipping Label”); } 此代码的工作原理是它将显示打印对话框,我可以选择我的打印机,将其配置为使用正确的标签库存,然后打印标签。 但是,正如其他post所示,它不会保存我选择的设置。 因此,如果我选择再次打印相同的图像而不关闭其间的应用程序,它将恢复为默认打印机,即使我选择了正确的打印机,也会将该打印机默认为默认设置,其中包括使用错误尺寸的标签库存。 因此,每次打印时,我都必须选择打印机并将其配置为使用正确的库存。 这在现实世界中使用是不可接受的。 经过大量的在线搜索后,我发现了很多关于此的post,但他们都谈到了保存PrintDialog.PrinterSettings对象,然后用它来初始化下一个PrintDialog实例。 但是,在WPF中, PrintDialog类没有PrinterSettings成员。 这是一个Win Forms对象。 为什么Win Forms和WPF PrintDialog对象是不同的,但这可能是一个无法回答的问题。 真正的问题是我现在所做的。 如有必要,我可以重新发明整个滚轮并拥有自己的打印机选择器和打印机配置页面,并使用PrintDocument对象打印图像并完全绕过PrintDialog […]

C#代码获取已安装或选定打印机的最大dpi

我想获得已安装或选择的打印机的最大Dpi。 我试过了 PrinterSettings ps = new PrinterSettings(); MessageBox.Show(ps.PrinterResolutions.ToString()); 我得到这个输出:System.Drawing.Printing.PrinterSettings + PreinterResolutionCollection(所需的输出是600×600)。

在WPF中打印多页

我必须打印我的表单,但只有一页进入是很大的,所以我需要打印2页,我的知识匮乏让我知道如何打印一页但热门如何打印多页。 你有什么建议我可以多页打印,所有的帮助将是欣赏。 谢谢。 干得好

WPF MVVM后台打印数据绑定问题

我正在使用wpf / mvvm开发销售点应用程序。 在交易生命周期的许多部分中,将在后台打印收据。 我已经使用其他示例在后台生成和打印收据。 我在后台打印UserControl,一切看起来都很棒。 然后我为控件创建了ViewModel,因此它可以加载要打印的事务。 我从2个基本文本框开始 – 文本标题“客户收据”和顶部标题“打印在:MM / dd / yy hh:mm tt”。 这是调试器在按下打印按钮时显示生命周期的方式: 创建新的控件实例。 创建ViewModel的新实例 设置INPC属性的文本 在Control上运行一个小节以获得所需的预打印尺寸 加载打印对话框并检索名称打印队列 缩放控件的大小以适合收据纸(不应该为我当前选择的打印机缩放,因为ImageArea宽度设置与我的UC相同) 根据“新”缩放图像大小重新测量和排列网格 调用PrintDialog.PrintVisual – 发送UserControl 打印机吐出收据 – 没有数据绑定文本 然后,我的调试器进入get {return _HeaderText; 部分代码 – 控件已经打印完毕。 有没有办法在控件发送到打印机之前强制控制数据绑定,而无需在面板中加载控件并使其可见? 我希望能够例如刷信用卡并让它在背景中打印带有签名行的收据,从一个小的弹出窗口询问CC详细信息(或滑动)。 有没有更好的方法来实现这一目标? PrintReceipt方法: ClientReceiptView control = new ClientReceiptView(Message); System.Windows.Controls.PrintDialog printDlg = new System.Windows.Controls.PrintDialog(); PrintQueue ReceiptPrinter = new LocalPrintServer().GetPrintQueue(“CITIZEN […]

.net结束打印活动

我使用以下代码使用PrintDocument类: printDocument.PrintPage += (s, ev) => { ev.Graphics.DrawImage(bitmap, Point.Empty); ev.HasMorePages = false; }; printDocument.EndPrint += (sender, args) => { var buyerDTO = buyerRow.Buyer; buyerDTO.EnvelopePrinted = true; View.Control.Invoke(new Action(() => View.UpdateBuyer(buyerDTO))); Manager.UpdateBuyer(buyerDTO); ((IDisposable)sender).Dispose(); View.Control.Invoke( new Action(() => View.SetResetPrintStatusEnable(View.CurrentBuyers.Any(buyer => buyer.EnvelopePrinted)))); }; printDocument.Print(); 据我所知, EndPrint事件发生在文档呈现(并发送到打印机),但尚未打印在纸上。 我应该查看实际打印在纸上的文件。 我怎样才能做到这一点?

Windows 8以编程方式打印Postscript文件

我在打印Postscript文件时发现了一个奇怪的问题。 所以这是我的设置: 我有一台Windows 8 PC ,在这台PC上有一个C#应用程序 “NetworkPrintTest.exe”,它在执行时应该打开一个PDF,生成一个Postscript文件,最终应该打印出来。 但它没有做任何事情。 我没有收到错误,但它也不会打印。 同样的程序在Windows 7上运行没有错误,我甚至让打印机打印文件。 如上所述,.ps文件在两个操作系统上都成功生成,但打印失败。 这是我应该打印文件的源代码。 public static bool SendBytesToPrinter(string szPrinterName, IntPtr pBytes, int dwCount, params string[] docName) { int dwWritten = 0; IntPtr hPrinter = new IntPtr(0); DOCINFOA di = new DOCINFOA(); bool flag = false; di.pDocName = “print document”; if (docName.Length > 0) di.pDocName = docName[0]; […]

在WPF应用程序中更改默认打印机

我正在寻找在WPF应用程序中更改默认打印机的最佳方法。 以下是我们希望应用程序可以执行的步骤。 从下拉列表中选择一个映射到打印机名称的位置。 将默认打印机更改为映射名称。 启动IE并指向SSRS报告。 然后,用户将从IE打印报告,该报告将使用新的默认打印机 第二步是我正在寻求帮助。 这是WMI的用例吗? 如果是这样,关于该主题的任何资源都将是一个巨大的帮助。 谢谢!