水晶报表攻克系列3-如何在程序中自定义纸张
水晶报表攻克系列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-如何在程序中自定义纸张相关推荐
- 水晶报表技术(3)——.NET 2005 中动态水晶报表的实现
.NET 2005 中动态水晶报表的实现<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office ...
- 微信小程序可以加服务器上的字体,微信小程序中自定义字体
微信小程序支持自定义字体开放出来也有段时间,这边整理下使用自定义字体中,容易忽略的一些问题,和简便的全局自定义方式.如果是同时加载两种字体包,先下载下来的会被后下载下来的字体包给覆盖. 官网接口文档 ...
- 微信小程序中自定义组件
文章目录 小程序项目 app.json pages/index/index.wxml pages/index/index.wxss pages/index/index.js 自定义组件 compone ...
- 微信小程序中自定义导航和地图定位
在健康码中,主要的难点技术就是在小程序中定位.自定顶部导航. 自定义导航 在微信小程序中,默认的顶部导航不能设置图片背景或者是透明背景,只能自定义导航. 在每一个页面中引入,就是得到自己定义[个性化的 ...
- 微信小程序中自定义背景导航栏透明背景设置
首先确定好自己要在哪个页面中使用自定义头部导航栏样式 在该页面中找到xxx.json文件中添加上 "navigationStyle":''custom" 这样在页面中头部 ...
- 小程序中自定义头部标题栏
小程序最开始只能全局定义头部标题栏,也就是说一旦你想某个页面自定义头部标题栏,那么所有的页面都需要重新定义(也就是所有页面都需要重写头部标题栏): 但现在新版本的微信已经开放了可以单页面自定义头部标题 ...
- 一脸懵逼学习Hadoop中的MapReduce程序中自定义分组的实现
1:首先搞好实体类对象: write 是把每个对象序列化到输出流,readFields是把输入流字节反序列化,实现WritableComparable,Java值对象的比较:一般需要重写toStrin ...
- 微信小程序中自定义函数的学习使用
新手,最近在给学校搞个党费计算器.需要自己定义函数来实现某个功能. 1.无参函数: 函数都是写在js文件里面的. Page({data:{income1:'0',},cal:function(e){t ...
- 《十》微信小程序中自定义组件的组件模板和样式
组件 WXML 模板: 组件模板的写法与页面模板相同. 模板数据绑定: 与普通的 WXML 模板类似,可以使用数据绑定. <!-- custom-component.wxml --> &l ...
- VB.NET水晶报表控件经验总结
VB.NET水晶报表控件经验总结 http://developer.51cto.com 2009-10-16 13:30 佚名 weaseek 我要评论(0) 这里介绍对于VB.NET水晶报表 ...
最新文章
- 音频数据文件格式(PCM,WAV,MIDI)简记
- 精益与敏捷开发(随笔)
- python3怎么创建一个链表_怎么创建一个自己的微信公众号
- Vue中进行断点调试的两种方式(使用外部浏览器和VsCode的 Debug for Chrome插件)
- linux 提取cpio_15. Linux提取RPM包文件(cpio命令)详解
- 更改Sharepoint管理中心端口号
- java编写学籍管理系统_java学籍管理系统源代码.doc
- android滤镜效果,Android图像处理之霓虹滤镜效果
- Flutter 实现微信摇一摇的功能 Flutter 加速度感应
- 【转】64位ORACLE客户端上plsql无法识别ORACLE_HOME解决方案
- Windows Server 2012虚拟桌面分辨率支持列表
- 6-5.添加HLSL顶点着色
- 汇编语言c标志位减法,5.2.3-2减法指令 - 汇编语言教程
- 中国石油大学(华东)计算机/软件考研经验分享
- 事后诸葛亮项目总结会议
- 四、文件信息 五、进程环境
- Win10更新后桌面右键反应慢的问题
- Servlet思维导图总结
- 用python画星空-python3的turtle画模仿3d星空,运动的恒星小宇宙
- android 支付sdk ----libPaySdk