【问题标题】:Printing WinForm with controls using PrintDocument component c# [closed]使用 PrintDocument 组件 c# 打印带有控件的 WinForm [关闭]
【发布时间】:2013-05-07 04:30:31
【问题描述】:

我真的不想让别人为我做我的工作,我真的很感激你朝着正确的方向前进。

我有几张表格需要打印。所有这些都由多个数据网格视图和其他控件组成。工作卡、制造表、库存切割清单、报价等。

我在互联网上尝试了很多可能的解决方案。 PrintForm 组件实际上是无用的,因为分辨率很差。我尝试了 Crystal Report,并取得了一些成功,我用它来生成和打印我的报价单和发票。

“捕获”表单(位图)...(我猜在我的情况下,女巫是 printForm 更好的替代品)不要把它剪掉。

MSDN Printing the Form (Visual C#)

我相当沮丧,因为这是测试前我的应用程序的最后一部分。 我真的很想了解和学习有关 PrintDocument 组件的所有知识,以便最终解决这个问题并获得一些 VS 打印经验。

我现在将深入了解 iText-Sharp 作为我最后的手段。所以请告诉我它是否会被证明是徒劳的(至少在我的情况下;)那将不胜感激。

感谢您的好心先生或女士您的时间和您的知识

最诚挚的问候

赫尔曼·维奎尔 在 Crystal Reports 中同样生成的报价单

我需要打印的表格...表格的数量取决于订购的产品类型和数量。

编辑:

我现在正在解决这个问题..

我怎样才能确保这适合一页? 目前缺少表格右侧的一部分。

private void CaptureScreen()
        {
            Graphics mygraphics = this.CreateGraphics();
            Size s = this.Size;
            memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
            Graphics memoryGraphics = Graphics.FromImage(memoryImage);
            IntPtr dc1 = mygraphics.GetHdc();
            IntPtr dc2 = memoryGraphics.GetHdc();
            BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
            mygraphics.ReleaseHdc(dc1);
            memoryGraphics.ReleaseHdc(dc2);
        }

【问题讨论】:

  • 那些担心拯救树木的人(比如我自己)所有这些表格最终都会出现在每台制造机器的触摸屏上:) [这也是我反对在这些表格中使用 Crystal 报告的动机] 和大多数订单是在线完成的,因此客户会收到 pdf 格式的报价和发票:) ...公司只想从 6 月 1 日开始测试软件。
  • 目前正在查看winformreports.co.uk
  • 打印控件永远不会让任何人满意,打印机的分辨率比显示器高 6 倍。所以每个像素都会在纸上变成一个 6x6 的斑点。您只是忘记了您项目的其他 90%,非常不清楚您希望我们对此做什么。
  • @HansPassant 很抱歉,如果我不清楚。我知道打印控件绝对不是一个好习惯,尤其是在相对专业的环境中。 (因此将 Crystal Reports 用于客户文档。)这只是一种临时解决方案,正如我所说,这些表单旨在显示在触摸屏上。我知道屏幕和打印机之间的分辨率差异:) 也不确定您所说的“您刚刚忘记了项目的其他 90%”是什么意思。谢谢您的评论

标签: winforms visual-studio-2010 c#-4.0 printdocument


【解决方案1】:

表单上的控件经过优化,可以在低分辨率光栅设备(屏幕)上呈现。
打印经过优化,可在高分辨率光栅设备(打印机)上呈现。

因此,如果您将表单渲染到打印机,您可能会得到一个非常小的打印件,或者一个低分辨率的大打印件(如屏幕)。

我不是打印专家...但我能想到的在纸上打印表单而没有低分辨率又大又丑的像素的唯一方法是重新渲染所有表单对象:枚举所有控件在表单上,​​并以您想要的方式自己绘制控件,这样您就可以准确地决定如何以高分辨率呈现它们。所以你可以决定按钮、组合框等边框的外观......

实现这样的事情看起来是一项非常艰巨的工作......

更新
另一个更简单的选项可能是使用位图到光栅转换器。
您可以将屏幕作为位图抓取,将位图传递到光栅到矢量转换器,获得位图的矢量化版本,然后您可以直接打印此基于矢量的图像。

但自动光栅到矢量的转换可能会起作用……也可能不起作用。
你的旅费可能会改变。

也许您可以尝试“手动”抓取屏幕并使用一些免费工具进行位图到矢量的转换,例如Inkscape(启动 Inkskape,导入位图,然后进入菜单 Path\Trace Bitmap ,并尝试各种选项(颜色、BW、平滑...))。
然后如果你有好的结果,也许you can find a raster-to bitmap tool 可以集成到你的应用程序中。

【讨论】:

  • 嗨,Max,首先感谢您的回答。
  • 这听起来确实是一项艰巨的工作。我评价最好在应用试验期间把它吸起来并有稍微模糊的制造表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2013-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多