我正在生成一个收据,并使用Graphics对象调用DrawString方法打印出所需的文本.
graphics.DrawString(string, font, brush, widthOfPage / 2F, yPoint, stringformat);
Run Code Online (Sandbox Code Playgroud)
这适用于我需要它做的事情.我总是知道我要打印出来的东西,所以我可以手动修剪任何琴弦,这样它就可以正确地放在80毫米的收据纸上.然后我不得不添加额外的功能,这将使这更灵活.用户可以传入将添加到底部的字符串.
由于我不知道他们要放什么,我只是创建了自己的自动换行功能,它包含了许多字符来包装和字符串本身.为了找出字符数,我做了这样的事情:
float width = document.DefaultPageSettings.PrintableArea.Width;
int max = (int)(width / graphics.MeasureString("a", font).Width);
Run Code Online (Sandbox Code Playgroud)
现在宽度正在返回283,以mm为单位约为72,这在80mm纸张上考虑边距时是有意义的.
但MeasureString方法在Courier New 8pt字体上返回10.5.因此,不是绕过我期望的36 - 40,我得到26,导致2行文本变成3-4.
PrintableArea.Width的单位是1/100英寸,图形对象的PageUnit是Display(对于打印机来说通常是1/100英寸).那么为什么我只回来26?
为什么发现这个神奇的矩形如此困难?
在OnPrintPage事件中,我有PrintPageEventArgs,我试图在最大可打印区域的范围内使用图形绘制.
我尝试过使用PageBounds,PrintableArea,Graphics.VisibleClipBounds等.所有都无法始终获得绘图区域,尤其是从横向切换到纵向布局时.从Landscape切换到Portrait时,PrintableArea似乎永远不会改变.
我还注意到,根据我是否正在进行打印预览和实际打印,如何设置Graphics.VisibleClipBounds存在差异.在预览中它始终显示纵向宽度/高度,因此我必须检查它是否是预览,并且当它是横向时我必须手动交换宽度/高度.
我需要一个算法来计算可打印区域,因为它与当前的图形上下文有关,而不是在实际绘图中没有使用的任意理论打印区域.
我关心的是处理Graphics矩阵偏移.到目前为止,我注意到如何根据以下因素使用硬边缘预翻译图形上下文之间存在严重的不一致:
有没有一种标准的方法来处理这个问题?我应该重置矩阵吗?当我将OriginAtMargins设置为true时,Graphics会预先转换为84,84,但我的边距是100,100.艰难的利润是16,16.它不应该被翻译成100,100吗?因为0,0应该在页面边界,而不是硬边距.
基本上我的方法应该总是在获得最佳的可打印矩形.我只需要一种与设备无关的一致方式来确保我的绘图原点(0,0)位于页面的左上角,以便上面的Rectangle对我有用.
在C#中,我尝试使用PrintDocument类使用以下代码打印图像.图像宽度为1200像素,高度为1800像素.我正在尝试使用小型zeebra打印机在4*6纸张中打印此图像.但该程序只打印4*6的大图像.这意味着它没有根据纸张尺寸调整图像!
PrintDocument pd = new PrintDocument();
pd.PrintPage += (sender, args) =>
{
Image i = Image.FromFile("C://tesimage.PNG");
Point p = new Point(100, 100);
args.Graphics.DrawImage(i, 10, 10, i.Width, i.Height);
};
pd.Print();
Run Code Online (Sandbox Code Playgroud)
当我使用"窗口打印"打印相同的图像时(右键单击并选择打印,它会自动缩放到纸张大小并正确打印.这意味着所有内容都来自4*6纸张.)我如何在C#程序中执行相同的操作?
我正在使用c#开发全屏信息亭应用程序.我需要打印门票和收据.我使用PrintDocument类进行打印.打印机完美打印,但我需要禁用打印过程中显示的弹出对话框.
我听说可以通过控制面板中的"打印机和传真"禁用它,但我在控制面板中没有"打印机和传真".
我可以禁用显示的对话框吗?如果可以,我该怎么办?
我正在为我们公司开发WinForm Printing应用程序.
打印文档时,我需要获取System.Drawing.Color文档上每个Control 的属性并创建一个System.Drawing.Brush对象来绘制它.
有没有办法将System.Drawing.Color值转换为System.Drawing.Brush值?
注意:我已经尝试过查看该System.Windows.Media.SolidColorBrush()方法,但似乎没有帮助.
c# system.drawing printdocument system.drawing.color winforms
这是我提出的最好的:
public static int GetPageCount( PrintDocument printDocument )
{
printDocument.PrinterSettings.PrintFileName = Path.GetTempFileName();
printDocument.PrinterSettings.PrintToFile = true;
int count = 0;
printDocument.PrintController = new StandardPrintController();
printDocument.PrintPage += (sender, e) => count++;
printDocument.Print();
File.Delete( printDocument.PrinterSettings.PrintFileName );
return count;
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?(这实际上很慢)
我正在编写一个WinForms .NET程序,需要在页面上放置一些文本(带有一些基本的几何/矢量图形).是否有相当于OS X的核心图形和/或核心文本?到目前为止,我只是使用a PrintDocument并使用Graphics提供的对象PrintPageEventArgs在页面上绘制文本,但是对于诸如字间距,行间距等内容的控制很少,并且必须手动完成许多工作.
我觉得我错过了一些东西; 有没有更好的方法来排版页面上的文字?我不介意使用第三方解决方案,只要它们是免费供个人使用.
这将用于排版少量文档,包括单页小册子/传单(大多数文本是可变的但图像是静态的),奖励证书(大多数文本和图像是静态的,但有些文本是可变的),时间表,等等
现在,我正在尝试在PrintDocument上构建我的表单,但是我看到页面上实际显示内容的唯一方法是打印一张纸.它有效,但我需要添加很多东西,而且我宁愿不浪费大量的纸张.现在我有一个打印对话框,但没有打印预览按钮.有没有办法让我出现?谢谢!
public partial class Form4 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components;
private System.Windows.Forms.Button printButton;
public Form4()
{
// The Windows Forms Designer requires the following call.
InitializeComponent();
}
// The Click event is raised when the user clicks the Print button.
private void printButton_Click(object sender, EventArgs e)
{
PrintDocument pd = new PrintDocument();
pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
PrintDialog pdi = new PrintDialog();
pdi.Document = pd;
if (pdi.ShowDialog() == DialogResult.OK)
{
pd.Print();
}
}
// The PrintPage event is raised for …Run Code Online (Sandbox Code Playgroud) 我的问题是我创建了一个"扩展"的RichTextBox控件,它使用本机API添加标准控件中缺少的许多RichEdit功能(即:修改选择的单个字体属性,而不更改其他字体属性,自动换行到打印机[如写字板]等).作为控件的一部分,我公开了一个PrintDocument,用于打印RichTextBox的格式化内容.当wordwrap设置为"Wrap To Printer"时,我将EM_SETTARGETDEVICE消息发送到RichTextBox,并使其换行到适当的长度.
当某些内容(用户/代码)更改了我的控件的WordWrap属性时,这一切都正常.但是,如果之后修改了PrintDocument,我无法知道它.因此,即使用户可能更改了PrintDocument上的边距,我的RichTextBoxEx也不会为更新的宽度重新发送EM_SETTARGETDEVICE,直到WordWrap属性发生更改.
我看到了一些可以克服这一点的选择,但我不是他们中的任何一个的忠实粉丝.这就是我所拥有的:
添加一个UpdatePrintDocument()方法或类似的方法,需要在控件外部的东西之后调用(即:父窗体上的PageSetupDialog)更新PrintDocument中的设置.缺点:我将分发控件,所以我想让它尽可能友好.虽然我可能记得在我成功更新PrintDocument设置时随时调用该方法,但其他人可能不会.亲:实施起来很简单.
创建一个新的PrintDocumentEx类,它基于PrintDocument并实现所需的"Changed"事件.缺点:可能还不够,可能需要创建PrintSettingsEx,PageSettingsEx等.Pro:实施一次,没有人再担心它.
我真的认为#2是我必须选择的选项但是对于下一个实例它不是非常可重用我需要一些类似的功能.我想我正在寻找的是一种将"通用PropertyChanged事件"附加到任何现有类属性的方法,因为这将适用于未来的情况.急于看到你们对我有什么:-)
你如何设置PrintDocument.PrinterSettings.PrinterName为默认打印机?
我不是在谈论在操作系统中设置默认打印机.相反,我说的是设置PrintDocument对象,以便它打印到默认打印机.
c# ×10
printdocument ×10
printing ×4
.net ×3
winforms ×2
gdi+ ×1
measurement ×1
typesetting ×1
windows-7 ×1