通过PaperSize自定义纸张打印,搞不定。 C#还有没有其它办法实现自定义纸张的功能???

lw8122 2005-09-10 12:52:23
PrintDocument pd=new System.Drawing.Printing.PrintDocument();
pd.DefaultPageSettings.PaperSize=new PaperSize("myPaper",400,600)
pd.PrintPage+=new PrintPageEventHandler(pd_PrintPage);
pd.Print();

这是MSDN里描述的自定义纸张的标准方法,但是执行后没有效果,打印机任然按照设置的缺省纸张来打印。

难道是这是微软的.net的BUG?????MSDN的描述应该是可以的,为什么使用起来就是不行????

以前用VB的时候做过打印,按照MSDN的描述,自定义纸张10分钟就试出来了。

为什么到了.NET时代,就不行了?????

使用.NET,除了PrintDocument来打印之外,还有没有其它方法可以实现打印?????

太郁闷了,从今天下午一直试到刚才,现在才回家,打印了一堆废纸,居然还没有搞定。

由于是打印长度不定的结帐单,如果不能程序控制纸长的长度,会被客户骂死的。

希望有解决办法的朋友,能指教一二,谢谢。

周6、周日外出旅游,不能回贴,还请谅解一下。

现在严重郁闷中。。。。 劳累中。。。。。 对.NET失望中。。。。。。。。

希望最后的结局,不要是因为.NET无法解决,而被迫使用VB来做dll处理,那就郁闷了。 已经1年没用过VB了,郁闷
...全文
3092 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
meadmfk 2006-06-23
  • 打赏
  • 举报
回复
谢谢长江支流的源代码。这些天我一直在学习中
WhiteLeaf 2005-09-29
  • 打赏
  • 举报
回复
支持
长江直流
他的打印源码对我受益也很大
长江支流 2005-09-15
  • 打赏
  • 举报
回复
TO:allanli(若尘)
哈哈,若尘说话了,楼主就照着若尘大侠的话去做。

有一次跟若尘交流时他说把Excel打印功能放在打印核心中不太好,有依赖。
于是我前些日子抽了些空晚上把与Excel相关的功能重构了一下并增加了些WorkSheet的操作如增、删、改、插入、定位、重命名工作表。

同样还是同时出C#与VB.net的使用工程,绝对公开源码(以前MIS金质打印通的源码也公开在贴子上了),用于WinForm与WebForm中的报表打印、套打、格式及图表分析。

不久就会也大家见面!

谢谢若尘。


TO: lw8122(随风)

另外,在此谢过(长江直流)。

你的大作,使我在写报表打印的时候,非常轻松,呵呵

--------------------------------------------------

噢,是楼主啊,哈哈,过奖了,大作不敢当,只是对于MIS的打印基本上满足一般的需要的。

有人说我开源是假的?哈哈,我打印程序的的核心全部公开了还说是假的?

对于真正想了解打印原理、打印机对话框、纸张设置设置并且做报表打印的网友来说有一些帮助。

还是一句话:写程序写的是思想,就如若尘所说:灵活使用

原楼主搞定。。。

lw8122 2005-09-15
  • 打赏
  • 举报
回复
谢谢若尘,我试试看
uscool 2005-09-14
  • 打赏
  • 举报
回复
在Windows2000以上的系统中不再有自定义纸张类型,代替的是“服务器属性”,如果你没有预先设置好你的纸型的话,在打印机的支持纸张类型中是找不到你在程序中的自定义纸张类型,所以,在打印之前还是需要预先设置的。
lw8122 2005-09-14
  • 打赏
  • 举报
回复
顶。

看看有没有人能解答
allanli 2005-09-14
  • 打赏
  • 举报
回复
灵活使用下面三个API就可以任意定义纸张格式大小了,不过对于一些激光打印纸以及在Win98不支持
这几个API

Public Declare Function AddForm Lib "winspool.drv" Alias "AddFormA" _
(ByVal hPrinter As IntPtr, ByVal Level As Int32, ByVal pForm As IntPtr) As Int32

Public Declare Function SetForm Lib "winspool.drv" Alias "SetFormA" _
(ByVal hPrinter As IntPtr, ByVal pFormName As String, ByVal Level As Int32, ByVal pForm As IntPtr) As Int32

Public Declare Function DeleteForm Lib "winspool.drv" Alias "DeleteFormA" _
(ByVal hPrinter As IntPtr, ByVal pFormName As String) As Int32
lw8122 2005-09-14
  • 打赏
  • 举报
回复
回小小风:

在系统中定义纸张,我也会啊。

我需要的是在程序中,指定纸张的高和宽,然后打印。

因为每个打印,纸张的高度都是不定的。



继续求: C#的解决办法,或者其它解决办法(比如API???? 或者是通过其它语言写DLL???)
lw8122 2005-09-13
  • 打赏
  • 举报
回复
顶一个,看看有没有过来人给我一个解答。

另外,在此谢过(长江直流)。

你的大作,使我在写报表打印的时候,非常轻松,呵呵
zeusvenus 2005-09-12
  • 打赏
  • 举报
回复
msdn上提供的信息不一定每个都正确,楼主可以查查其他解决方案,网上挺多的。
lw8122 2005-09-12
  • 打赏
  • 举报
回复
to 长江支流:

设置自定义纸张,自定义大小是没有问题的。

也不用把自定义纸张设置为缺省纸张,在C#中可以指定纸张。

但是,即使使用了自定义纸张,仍然无法解决在程序中指定纸张的大小啊。

也就是说,这样一来,就需要N多种自定义纸张。

C#啥都好,但是做程序做了一个多月,现在才被卡在打印这一环节上,郁闷啊!!!!

曾经用VB可以,一直以为C#也一定可以。
长江支流 2005-09-12
  • 打赏
  • 举报
回复
据我所知,除于进入控制面版设置自定义纸张并设置成默认的后用PaperSize外,没有直接的方法

其次是调用API,第二种方法你可以找一下VB.net版的“若尘”。
lw8122 2005-09-12
  • 打赏
  • 举报
回复
回豆豆糖、杨雪:

在打印机中添加纸张,然后在C#中调用纸张是可行的。

但是,在使用过程中,必须添加自定义纸张看起来挺麻烦的。

另外,每一次打印的纸张长度都是不同的,纸张长度根据内容的多少而定。 那么,如果自定义纸张,就需要定义N多种纸张才行啊。

在VB中,就像使用C#的paperSize一样,给定纸张大小就可以了。 区别就是: VB中设置了有效,而C#设置了无效。


to:(清柳)

我在网上也搜过了,有人使用其它东西做的这种打印,比如DEPHI。

我想问问,如果不动打印机设置,不借助其它语言的帮助,能否搞定这个问题????

C#中打印,除了printDocument和水晶报表之外,还有没有其它打印的方法?????

这里应该有过来人吧,说说怎样处理啊,至少给点提示啊。
cdo 2005-09-12
  • 打赏
  • 举报
回复
帮顶一下.
ttjacky 2005-09-12
  • 打赏
  • 举报
回复
是不是打印机那边也要添加相应的自定义纸张??
erental 2005-09-12
  • 打赏
  • 举报
回复
mark
winteryoung84 2005-09-12
  • 打赏
  • 举报
回复
关注
WangGuangJun 2005-09-12
  • 打赏
  • 举报
回复
关注

mark44404 2005-09-11
  • 打赏
  • 举报
回复
那你就在windows中强制打印设置
lw8122 2005-09-11
  • 打赏
  • 举报
回复
private void printList()
{
PrintDocument pd=new System.Drawing.Printing.PrintDocument();
pd.DocumentName="测试打印项目";
PaperSize pkCustomSize = new PaperSize("First custom size",(int)(82.55*100/25.4+1),(int)(184.0*100/25.4+1));
pd.DefaultPageSettings.PaperSize = pkCustomSize;
pd.DefaultPageSettings.Margins.Top = 0;
pd.DefaultPageSettings.Margins.Left =0;
pd.DefaultPageSettings.Margins.Bottom = 0;
pd.DefaultPageSettings.Margins.Right = 0;
pd.PrintPage+=new PrintPageEventHandler(pd_PrintPage);
pd.EndPrint+=new PrintEventHandler(pd_EndPrint);
pd.Print();
}

to: mark44404(杨雪)

谢谢你的关注

我把你提供的代码拷贝下来试了一下,还是不行的。

你提供的代码,理论上可以,但是用起来不行,不知你测试过没有?

所以我说这可能是微软.Net的bug。

paperDocument.PrinterSettings.PaperSizes[index]中的任何一种纸张,都是可用的。

而new一个pagesize,是没用的。 如果使用new的pagesize,打印结果一定是打印机设置的缺省纸张

不知道有没有过来人,给指定一下,怎么处理这个问题????

或者绕开这个问题也可以?????
加载更多回复(2)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧