水晶报表攻克系列3-如何在程序中自定义纸张

  大家都知道电脑里会有预定义好的纸张,例如A4。但是最近做发票,快递单时,纸张大小需要自定义。

  例如:

1     ReportDocument doc = new ReportDocument();
2     doc.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4;

  CrystalDecisions.Shared.PaperSize查看定义可知,是一个枚举类,里面只有41种预定义的纸张类型。而且,doc.PrintOptions.PaperSize不可以自定义纸张的宽和高。

  

  经过查阅资料,有一种比较好的办法:

  1) 在开始菜单,“打印机和传真”=》文件菜单项,服务器属性中,添加自定义纸张,设置自定义纸张的名称。

  2) 在程序中就可以通过获取该自定义纸张的id,来设置PaperSize,程序如下:

  

1         doc.PrintOptions.PaperSize = (CrystalDecisions.Shared.PaperSize)(GetSelectedPaperSizeId());

 1         /// <summary>
 2         /// 获取用户自定义纸张ID
 3         /// </summary>
 4         public int GetSelectedPaperSizeId()
 5         {
 6             string printer = "";
 7             string printerName = PrinterSetting.PostPrinterName;
 8             string paperName = PrinterSetting.PostPrinterUserPaperSize;
 9             foreach (string printerItem in System.Drawing.Printing.PrinterSettings.InstalledPrinters)
10             {
11                 if (printerItem.Contains(printerName))
12                 {
13                     printer = printerItem;
14                 }
15             }
16             Microsoft.Win32.RegistryKey rk;
17             if (!printer.StartsWith(@"\\"))        //本地打印机
18             {
19                 rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\" + printer + "\\DsDriver");
20             }
21             else                                //网络打印机
22             {
23
24                 string[] p = printer.Remove(0, 2).Split(new char[] { '\\' });
25                 string path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Providers\\LanMan Print Services\\Servers\\" + p[0] + "\\Printers\\" + p[1] + "\\DsDriver";
26                 rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(path);
27             }
28
29             string[] papers = (string[])(rk.GetValue("printMediaSupported"));
30             int index = 0;
31             int paperid = 0;
32             foreach (string paper in papers)
33             {
34                 if (paper == paperName)
35                 {
36                     paperid = index;
37                 }
38                 index++;
39             }
40
41             int[] sizes = PrinterHelper.Get_PaperSizes(printerName);
42             int paperSizeid = sizes[paperid];
43             return paperSizeid;
44         }

  其中PrinterHelper类如下:

  

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Runtime.InteropServices;
 6
 7 namespace Gasgoo.Invoice.Common
 8 {
 9     public class PrinterHelper
10     {
11         public static string OutputPort = String.Empty;
12
13         [DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
14         public static extern int DeviceCapabilities(string pDevice, string pPort, short fwCapabilities, IntPtr pOutput, IntPtr pDevMode);
15
16         public static int[] Get_PaperSizes(string printer)
17         {
18             string text1 = printer;
19             int num1 = FastDeviceCapabilities(0x10, IntPtr.Zero, -1, text1);
20             if (num1 == -1)
21             {
22                 return new int[0];
23             }
24             int num2 = Marshal.SystemDefaultCharSize * 0x40;
25             IntPtr ptr1 = Marshal.AllocCoTaskMem(num2 * num1);
26             FastDeviceCapabilities(0x10, ptr1, -1, text1);
27             IntPtr ptr2 = Marshal.AllocCoTaskMem(2 * num1);
28             FastDeviceCapabilities(2, ptr2, -1, text1);
29             IntPtr ptr3 = Marshal.AllocCoTaskMem(8 * num1);
30             FastDeviceCapabilities(3, ptr3, -1, text1);
31             int[] sizeArray1 = new int[num1];
32             for (int num3 = 0; num3 < num1; num3++)
33             {
34                 string text2 = Marshal.PtrToStringAuto((IntPtr)(((long)ptr1) + (num2 * num3)), 0x40);
35                 int num4 = text2.IndexOf('\0');
36                 if (num4 > -1)
37                 {
38                     text2 = text2.Substring(0, num4);
39                 }
40                 short num5 = Marshal.ReadInt16((IntPtr)(((long)ptr2) + (num3 * 2)));
41                 int num6 = Marshal.ReadInt32((IntPtr)(((long)ptr3) + (num3 * 8)));
42                 int num7 = Marshal.ReadInt32((IntPtr)((((long)ptr3) + (num3 * 8)) + 4));
43                 sizeArray1[num3] = System.Convert.ToInt32(num5);
44             }
45             Marshal.FreeCoTaskMem(ptr1);
46             Marshal.FreeCoTaskMem(ptr2);
47             Marshal.FreeCoTaskMem(ptr3);
48             return sizeArray1;
49         }
50
51         private static int FastDeviceCapabilities(short capability, IntPtr pointerToBuffer, int defaultValue, string printerName)
52         {
53             int num1 = DeviceCapabilities(printerName, OutputPort, capability, pointerToBuffer, IntPtr.Zero);
54             if (num1 == -1)
55             {
56                 return defaultValue;
57             }
58             return num1;
59         }
60     }
61 }

  这样,就可以完整的获取用户自定义的纸张了。

  下一节,会为大家分享如何使用子报表。

转载于:https://www.cnblogs.com/MarkRao/archive/2012/10/30/cr3.html

水晶报表攻克系列3-如何在程序中自定义纸张相关推荐

  1. 水晶报表技术(3)——.NET 2005 中动态水晶报表的实现

    .NET 2005 中动态水晶报表的实现<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...

  2. 微信小程序可以加服务器上的字体,微信小程序中自定义字体

    微信小程序支持自定义字体开放出来也有段时间,这边整理下使用自定义字体中,容易忽略的一些问题,和简便的全局自定义方式.如果是同时加载两种字体包,先下载下来的会被后下载下来的字体包给覆盖. 官网接口文档 ...

  3. 微信小程序中自定义组件

    文章目录 小程序项目 app.json pages/index/index.wxml pages/index/index.wxss pages/index/index.js 自定义组件 compone ...

  4. 微信小程序中自定义导航和地图定位

    在健康码中,主要的难点技术就是在小程序中定位.自定顶部导航. 自定义导航 在微信小程序中,默认的顶部导航不能设置图片背景或者是透明背景,只能自定义导航. 在每一个页面中引入,就是得到自己定义[个性化的 ...

  5. 微信小程序中自定义背景导航栏透明背景设置

    首先确定好自己要在哪个页面中使用自定义头部导航栏样式 在该页面中找到xxx.json文件中添加上 "navigationStyle":''custom" 这样在页面中头部 ...

  6. 小程序中自定义头部标题栏

    小程序最开始只能全局定义头部标题栏,也就是说一旦你想某个页面自定义头部标题栏,那么所有的页面都需要重新定义(也就是所有页面都需要重写头部标题栏): 但现在新版本的微信已经开放了可以单页面自定义头部标题 ...

  7. 一脸懵逼学习Hadoop中的MapReduce程序中自定义分组的实现

    1:首先搞好实体类对象: write 是把每个对象序列化到输出流,readFields是把输入流字节反序列化,实现WritableComparable,Java值对象的比较:一般需要重写toStrin ...

  8. 微信小程序中自定义函数的学习使用

    新手,最近在给学校搞个党费计算器.需要自己定义函数来实现某个功能. 1.无参函数: 函数都是写在js文件里面的. Page({data:{income1:'0',},cal:function(e){t ...

  9. 《十》微信小程序中自定义组件的组件模板和样式

    组件 WXML 模板: 组件模板的写法与页面模板相同. 模板数据绑定: 与普通的 WXML 模板类似,可以使用数据绑定. <!-- custom-component.wxml --> &l ...

  10. VB.NET水晶报表控件经验总结

    VB.NET水晶报表控件经验总结 http://developer.51cto.com  2009-10-16 13:30  佚名  weaseek  我要评论(0) 这里介绍对于VB.NET水晶报表 ...

最新文章

  1. 音频数据文件格式(PCM,WAV,MIDI)简记
  2. 精益与敏捷开发(随笔)
  3. python3怎么创建一个链表_怎么创建一个自己的微信公众号
  4. Vue中进行断点调试的两种方式(使用外部浏览器和VsCode的 Debug for Chrome插件)
  5. linux 提取cpio_15. Linux提取RPM包文件(cpio命令)详解
  6. 更改Sharepoint管理中心端口号
  7. java编写学籍管理系统_java学籍管理系统源代码.doc
  8. android滤镜效果,Android图像处理之霓虹滤镜效果
  9. Flutter 实现微信摇一摇的功能 Flutter 加速度感应
  10. 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案
  11. Windows Server 2012虚拟桌面分辨率支持列表
  12. 6-5.添加HLSL顶点着色
  13. 汇编语言c标志位减法,5.2.3-2减法指令 - 汇编语言教程
  14. 中国石油大学(华东)计算机/软件考研经验分享
  15. 事后诸葛亮项目总结会议
  16. 四、文件信息 五、进程环境
  17. Win10更新后桌面右键反应慢的问题
  18. Servlet思维导图总结
  19. 用python画星空-python3的turtle画模仿3d星空,运动的恒星小宇宙
  20. android 支付sdk ----libPaySdk

热门文章

  1. 3640 交换机实验的一些摘要【待进一步更新】
  2. CommandTarget属性
  3. bind2nd的注意事项 zz
  4. 用R语言分析我和男友的聊天记录
  5. “工作5年,存款为0”:那些拼命的人是怎么被拖垮的?
  6. 关于data.table中i, j, by都为数字的理解
  7. Abp框架多租户源码解读
  8. 边工作边刷题:70天一遍leetcode: day 26
  9. php扩展开发2--添加类
  10. 基于 WebGL 的 HTML5 3D 工控隧道可视化系统