.Net 提供的打印类PrintDocument 非常简洁易用,不过在实际应用开发中往往需要对纸张进行自定义,尤其是需要进行票据打印时。这个问题也困扰了我许久,经过查阅相关的资料和多次尝试,发现 其实也很简单。下面的示例就是我在.Net2.0已经验证可行的办法:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Printing; namespace PrintService
{
class AFCSPrinter :
{
/*页面打印委托*/
public delegate void DoPrintDelegate(Graphics g, ref bool HasMorePage); PrintDocument iSPriner = null;
bool m_bUseDefaultPaperSetting = false; DoPrintDelegate DoPrint = null; public AFCSPrinter()
{
iSPriner = new PrintDocument();
iSPriner.PrintPage += new PrintPageEventHandler
(this.OnPrintPage); } public void Dispose()
{
if (iSPriner != null) iSPriner.Dispose();
iSPriner = null; } /*设置打印机名*/
public string PrinterName
{
get { return iSPriner.PrinterSettings.PrinterName; }
set { iSPriner.PrinterSettings.PrinterName = value; }
} /*设置打印文档名*/
public string DocumentName
{
get { return iSPriner.DocumentName; }
set { iSPriner.DocumentName = value; }
} /*设置是否使用缺省纸张*/
public bool UseDefaultPaper
{
get { return m_bUseDefaultPaperSetting; }
set
{
m_bUseDefaultPaperSetting = value;
if (!m_bUseDefaultPaperSetting)
{
//如果不适用缺省纸张则创建一个自定义纸张,注意,必须使用这个版本的构造函数才是自定义的纸张
PaperSize ps=new PaperSize("Custom Size 1",,);
//将缺省的纸张设置为新建的自定义纸张
iSPriner.DefaultPageSettings.PaperSize = ps;
}
}
} /*纸张宽度 单位定义为毫米mm*/
public float PaperWidth
{
get { return iSPriner.DefaultPageSettings.PaperSize.Width / 100f * 25.4f; }
set
{
//注意,只有自定义纸张才能修改该属性,否则将导致异常
if(iSPriner.DefaultPageSettings.PaperSize.Kind==PaperKind.Custom)
iSPriner.DefaultPageSettings.PaperSize.Width = (int)(value / 25.4 * );
}
} /*纸张高度 单位定义为毫米mm*/
public float PaperHeight
{
get { return (int)iSPriner.PrinterSettings.DefaultPageSettings.PaperSize.Height / 100f * 25.4f; }
set
{
//注意,只有自定义纸张才能修改该属性,否则将导致异常
if (iSPriner.DefaultPageSettings.PaperSize.Kind == PaperKind.Custom)
iSPriner.DefaultPageSettings.PaperSize.Height = (int)(value / 25.4 * );
}
} /*页面打印*/
private void OnPrintPage(object sender, PrintPageEventArgs ev)
{ //调用委托绘制打印内容
if (DoPrint != null)
{
bool bHadMore = false;
DoPrint(ev.Graphics, ref bHadMore);
ev.HasMorePages = bHadMore; } } /* 开始打印*/
public void Print(DoPrintDelegate doPrint)
{ DoPrint = doPrint;
this.iSPriner.Print();
}
}
}

这个示例是在不要需要用户通过UI设置纸张的情况下使用。如果需要提供界面给用户选择或设置纸张则需要改造

c# PrintDocument 设置自定义纸张大小的示例的更多相关文章

  1. [Q]自定义纸张大小

    问:当打印机纸张列表里没有符合要求的纸张大小,例如如何打印加长图?答:当打印非标准图框时,你可能在图纸列表里找不到想要纸幅.你需要自己新建你需要的纸幅,以pdfFactory虚拟打印机为例(其它打印机 ...

  2. 在C#中设置打印机纸张大小

    using System.Drawing.Printing.PrintDocument using System.Drawing.Printing.PrinterSettings.PaperSizeC ...

  3. 水晶报表自定义纸张大小打印 (Crystal Report Print with custom paper size)

    System.Drawing.Printing.PrintDocument doc = new PrintDocument(); doc.PrinterSettings.PrinterName = & ...

  4. C# 将Excel转为PDF时自定义表格纸张大小

    通过后端程序将Excel表格转为PDF格式时,直接转换后的PDF效果可能出现表格页面过小或者过大,导致页面内容分布不均.要改善转换后的文档效果,只需在转换前自定义表格纸张大小,即可调整转换后的PDF页 ...

  5. 利用ActiveX实现web页面设置本地默认打印机、纸张大小

    通常web技术无法设置本地计算机的默认打印机,包括用代码设置纸张大小,如果业务系统中真遇到这种需求,只能通过其它辅助手段(比如ActiveX)实现.下面这段代码,出自网上被广泛使用的"泥人张 ...

  6. C#控制条码打印机 纸张大小,间距,绘制内容(所有条码打印机通用)

    其他条码知识 请访问:http://www.ybtiaoma.com ,本文仅供参考,请勿转载,谢谢 using System; using System.Drawing; using System. ...

  7. c#实现打印功能,可以设置纸张大小,字体和颜色等

    /// <summary> /// 打印的按钮 /// </summary> /// <param name="sender"></par ...

  8. C#中使用自定义的纸张大小

    using System.Drawing.Printing; using System.Drawing; private void Test() { PrintDocument m_pdoc = ne ...

  9. C#调用windows api控制打印机 状态获取 打印 自定义纸张 完整版

    using System; using System.Text; using System.Runtime.InteropServices; using System.Security; using ...

随机推荐

  1. vim插件:latex-suite 使用方法

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4030057.html 零.操作快捷键:对于<++>的块,按下ctrl+j即可快速 ...

  2. php使用phpmailer发送邮件

    本人新手,由于要做邮件发送验证码,所以找到和搜集到这些,本人亲测完全可以用 这是163邮箱的   因为不是企业邮箱填写的账号是163的账号,但是密码是授权码 授权码的获取方式为:

  3. ecshop二次开发 给商品添加自定义字段

    说起自定义字段,我想很多的朋友像我一样会想起一些开源的CMS(比如Dedecms.Phpcms.帝国)等,他们是可以在后台直接添加自定义字段的. 抱着这种想法我在Ecshop的后台一顿找,不过肿么都木 ...

  4. 利用数据库链做DML操作时报ORA-02069: global_names parameter must be set to TRUE for this operation

    按照 http://space.itpub.net/195110/viewspace-711110 的说法顺利解决问题. 通过DBLink更新远程数据的时候,如果使用到本地的sequence.函数.过 ...

  5. 教育O2O在学校落地,学堂在线瞄准混合式教学

    (大讲台—国内首个it在线教育混合式自适应学习平台.) 进入2015年,互联网教育圈最火的词非“教育O2O”莫属.不断刷新的融资金额和速度,不断曝光的正面和负面新闻,都让教育O2O公司赚足了眼球.然并 ...

  6. CODEVS 1069关押罪犯

    题目描述 Description S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极 不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用“怨 ...

  7. Angular js总结

    之前看过一些angular js的相关技术文档,今天在浏览技术论坛的时候发现有问angular js是做什么用的? 于是有了一个想法,对于自己对angular js 的认知做一个总结. 总结: ang ...

  8. Linux下 config/configure/Configure、make 、make test/make check、sudo make install 的作用

    转自Linux下 config/configure/Configure.make .make test/make check.sudo make install 的作用 这些都是典型的使用GNU的AU ...

  9. android 进度对话框的使用

    import android.app.Activity; import android.app.ProgressDialog; import android.os.Bundle; public cla ...

  10. jsp接收相同复合参数 request.getParameterValues()用法

    在网站中往往需要用户选择复选框,此时需要创建多个复选框让用户进行选择: <head> <meta http-equiv="Content-Type" conten ...