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

水晶报表查看器CrystalReportViewer自带打印功能,调用当前系统默认打印机进行打印,但.NET里的水晶版本不支持Web打印,需要水晶报表10以上的版本才支持。另外由于其他原因,我们大多需要自己写代码进行打印,这就牵扯到如何写代码、如何设置打印参数的问题,以下是一些基本知识:

打印的基本代码:

CrystalReport1 report = new CrystalReport1(); //Report为你自己的报表名
PageMargins margins;
margins = Report.PrintOptions.PageMargins;
margins.bottomMargin = 250;
margins.leftMargin = 350;
margins.rightMargin = 350;
margins.topMargin = 350;
// Apply the page margins.
Report.PrintOptions.ApplyPageMargins(margins);

// Select the printer.
string printerName = "\\\\局域网机器名\\打印机名(例如HP 2100)"; //本地打印机直接指定名称
Report.PrintOptions.PrinterName = printerName;          //指定打印机名称
Report.PrintOptions.PaperSize = PaperSize.PaperA4;   //指定纸张尺寸

report.PrintToPrinter(1, true, 1, 4);

本文由xwdd129编写,转载请注明出处,谢谢!

下面简单就打印中的参数进行说明:

PrintOptions类,提供用于设置报表打印选项的属性和方法。

PrintOptions成员:
    PageContentHeight---Int32,获取页面内容的高度
    PageContentWidth---Int32,获取页面内容的宽度
    PageMargins---获取报表的边距
    PageOrientation---获取或设置打印机纸张方向
    Pagesize---获取或设置当前打印机纸张的大小
    PrinterName---字符串,获取或设置报表所使用的打印机名称

ReportDocument.PrintToPrinter方法
public virtual void PrintToPrinter( int nCopies, bool collated, int startPageN, int endPageN )
    nCopies 指明要打印的分数
    collated 指明是否逐份打印
    startPageN 指明要打印的第一页
    endPageN 指明要打印的最后一页

发表于 @ 2006年06月01日 16:00:00|评论(3)|编辑

新一篇: 正在换工作…… | 旧一篇: 关于推模式水晶报表数据源的设置问题评论
#DaChu 发表于2007-09-24 12:04:54 IP: 121.28.161.*
margins = Report.PrintOptions.PageMargins
其中Report需要添加哪个引用?
我的是11.5版本,使用CRAXDRT.Report
系统告之:不包含PrintOptions定义

谢谢
we_are_friend2008@163.com#pshy 发表于2007-12-18 09:48:17 IP: 59.36.90.*
Papersize里面就只有那些纸张格式,请问还能增加自定义的纸张???#pshy 发表于2007-12-18 09:49:46 IP: 59.36.90.*
或者能自定义一个类似Papersize的类吗?

因为水晶报表的PaperSize是enum类型,但有时客户用的纸张不在其定义范围内,虽然在设计报表时可以选择目的打印机和纸型,但如果重新配置过该打印机则报表默认纸型不再有效,报表将按A4进行预览且会失真。

//获取本机所有打印机将其名称填充到comboBoxPrinters中:包含本地和网络打印机

foreach(string printer in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
{
    this.comboBoxPrinters.Items.Add(printer);
}

//当从comboBoxPrinters中选择打印机时获取其支持的纸张大小将其填充到listBoxPapers

this.listBoxPapers.Items.Clear();
string printer = this.comboBoxPrinters.Text;
this.m_printer = printer;
Microsoft.Win32.RegistryKey rk;
if(!this.comboBoxPrinters.Text.StartsWith(@"\\"))        //本地打印机

rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\" + this.comboBoxPrinters.Text + "\\DsDriver");
else                                //网络打印机

{
               
    string[] p = printer.Remove(0,2).Split(new char[] { '\\' });
    string path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Providers\\LanMan Print Services\\Servers\\" + p[0] + "\\Printers\\" + p[1] + "\\DsDriver";
     rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(path);
}

string[] papers = (string[])(rk.GetValue("printMediaSupported"));
for(int i=0;i<papers.Length;i++)
{
    this.listBoxPapers.Items.Add(papers[i]);
}

//根据纸张名称获取其所在本地机上的PaperSize:调用的是PaperSizeGetter.Get_PaperSizes静态方法(是从水晶报表中reflect精简出来的,版权归原作者所有)

public class PaperSizeGetter
    {
        public static string OutputPort = String.Empty;

[DllImport("winspool.drv", CharSet=CharSet.Auto, SetLastError=true)]
        public static extern int DeviceCapabilities(string pDevice, string pPort, short fwCapabilities, IntPtr pOutput, IntPtr pDevMode);

public static int[] Get_PaperSizes(string printer)
        {
            string text1 = printer;
            int num1 = FastDeviceCapabilities(0x10, IntPtr.Zero, -1, text1);
            if (num1 == -1)
            {
                return new int[0];
            }
            int num2 = Marshal.SystemDefaultCharSize * 0x40;
            IntPtr ptr1 = Marshal.AllocCoTaskMem(num2 * num1);
             FastDeviceCapabilities(0x10, ptr1, -1, text1);
            IntPtr ptr2 = Marshal.AllocCoTaskMem(2 * num1);
             FastDeviceCapabilities(2, ptr2, -1, text1);
            IntPtr ptr3 = Marshal.AllocCoTaskMem(8 * num1);
             FastDeviceCapabilities(3, ptr3, -1, text1);
            int[] sizeArray1 = new int[num1];
            for (int num3 = 0; num3 < num1; num3++)
            {
                string text2 = Marshal.PtrToStringAuto((IntPtr) (((long) ptr1) + (num2 * num3)), 0x40);
                int num4 = text2.IndexOf('\0');
                if (num4 > -1)
                {
                     text2 = text2.Substring(0, num4);
                }
                short num5 = Marshal.ReadInt16((IntPtr) (((long) ptr2) + (num3 * 2)));
                int num6 = Marshal.ReadInt32((IntPtr) (((long) ptr3) + (num3 * 8)));
                int num7 = Marshal.ReadInt32((IntPtr) ((((long) ptr3) + (num3 * 8)) + 4));
                 sizeArray1[num3] = System.Convert.ToInt32(num5);
            }
            Marshal.FreeCoTaskMem(ptr1);
            Marshal.FreeCoTaskMem(ptr2);
            Marshal.FreeCoTaskMem(ptr3);
            return sizeArray1;
        }

private static int FastDeviceCapabilities(short capability, IntPtr pointerToBuffer, int defaultValue, string printerName)
        {
            int num1 = DeviceCapabilities(printerName, OutputPort, capability, pointerToBuffer, IntPtr.Zero);
            if (num1 == -1)
            {
                return defaultValue;
            }
            return num1;
        }
    }

//根据纸型名称在其名称列表中的索引,获取该索引在调用Get_PaperSizes后的size数组中的对应值

int[] sizes = PaperSizeGetter.Get_PaperSizes(printerName);
int paperSizeid = sizes[this.listBoxPapers.SelectedIndex];

//将该size赋值给报表对象

report.PrintOptions.PaperSize = (CrystalDecisions.Shared.PaperSize)(paperSizeid);

水晶报表自定义纸张大小打印 (转)相关推荐

  1. C# 自定义纸张大小打印 PDF

    当打印PDF文档的时候,默认情况下纸张大小是A4.但是有些情况下原文档不是A4大小,我们需要保持原来的页面大小怎么办呢?这个时候就需要自定义纸张大小来实现这个功能.本文将介绍如何使用.NET PDF组 ...

  2. 水晶报表设置纸张大小

    附 自定义纸张的设置方法: 点开始-→点"设置"中的"控制面板"-→选择"打印机和传真"-→点主菜单中的"文件" -→选 ...

  3. access的papersize命令_[access报表]报表中使用自定义纸张,及设置自定义纸张大小

    时 间:2009-05-08 08:39:23 作 者:摘 要:报表中使用自定义纸张,及设置自定义纸张大小 正 文: 报表中使用自定义纸张,及设置自定义纸张大小 Private Type str_DE ...

  4. 弄了一整天,终于把打印自定义纸张大小搞定了(上)--IT man

    Csdn-Blog <script language="javascript" src="http://www.023rcsc.com/count/count2.a ...

  5. Java 打印PDF文档 - 指定打印机、自定义纸张大小、设置打印参数、显示打印对话框等

    这篇文章介绍如何在Java应用程序中打印PDF文档以及进行一些打印设置,包括指定打印机.自定义纸张大小.设置打印参数.以及显示打印对话框等. 导入jar文件 本文所使用的PDF类库是Spire.PDF ...

  6. 【python-docx】插入节、自定义纸张大小、纸张方向、页边距、装订线、页眉页脚、首页相同和奇偶页不同

    1.插入节 Word可以把文档分成不同的部分方便管理,即不同的节,在python-docx把节用Section对象表示,Document对象有add_section()方法添加节,可以通过sectio ...

  7. 打印机服务器纸张属性不显示,为什么我的打印机能在打印机服务器属性里设置自定义纸张大小,却无法? 爱问知识人...

    问题原因及解决方法 1.在以往的Windows 98操作系统中,打印机属性里的"纸张大小"中有"自定义"一项.而Windows 2000和Windows XP中 ...

  8. 弄了一整天,终于把打印自定义纸张大小搞定了

    长江支流说的办法保留太多了,结果不行,很多类都是他在程序集里自定义的,源码又没公开 不过还是要感谢他的提示 今天和小陈搞了一天,他在国外的论坛上看到了一篇文章得到了启示,最后我们在凌晨3点终于把自定义 ...

  9. 打印系统开发(23)——c# PrintDocument 设置自定义纸张大小的示例

    .Net 提供的打印类PrintDocument 非常简洁易用,不过在实际应用开发中往往需要对纸张进行自定义,尤其是需要进行票据打印时.这个问题也困扰了我许久,经过查阅相关的资料和多次尝试,发现其实也 ...

最新文章

  1. 科普:浅谈 Hellinger Distance
  2. 西安python培训班多少钱-西安python培训多少钱?
  3. string操作小汇总
  4. 计算机英语基础课程论文,计算机专业英语课程教学论文
  5. 单机PC手动更改windows update 地址
  6. python func_Python functool module
  7. oracle ebs 数据源,Oracle EBS环境下查找数据源(Form篇)
  8. 面试题:常用的http状态码
  9. 拓端tecdat|在Python中使用LSTM和PyTorch进行时间序列预测
  10. 酒店管理系统-需求说明书
  11. gradle下载不下来依赖包_Gradle 下载依赖jar包及源码
  12. GIT文档同步MinDoc - MinDoc模拟登陆
  13. 东方时尚驾校学习心得
  14. 新西兰理工大学计算机专业排名,有关往年新西兰的大学专业排名
  15. 斑马旅游在千帆竞发的出境游市场能否找到属于自己的道路?
  16. DB2 windows下9.5安装教程
  17. go 条件变量简介 sync.Cond
  18. C++右值引用与函数返回值
  19. 《四大文明古国》读书笔记思维导图,感受人类文明
  20. Xshell4连接Linux后 win快捷键锁屏

热门文章

  1. YOLOv5-优化器和学习率调整策略
  2. 高德地图实现逻辑及代码
  3. linux搭建pptpd服务器,最简单的Linux系统上的pptpd服务器安装
  4. pytest单元测试
  5. 程序开发团队之团队精神篇(转)
  6. matlab模拟嫦娥奔月,2017年6月英语六级翻译模拟练习题:嫦娥奔月
  7. turtle更多函数 难度0
  8. 数据挖据---机器学习平台之H2O架构/接口/实践
  9. [DZ X2.5实用教程] DZ X2.5(Discuz!)论坛-QQ企业OR域名邮箱作为发信邮箱设置教程
  10. Scratch-(六)-妙笔生花