c#打印控件PrintDocument设置成自定义大小的纸张后,打印出来的字体变瘦长了

zjzhong 2010-08-31 08:04:10
PrintDocument设置成自定义大小的纸张DefaultPageSettings.PaperSize = new PaperSize("Custom", 826, 492)

在PrintPage事件中打印一个字符串:
e.Graphics.DrawString("这是一个测试字符串", new Font("宋体", 9, FontStyle.Regular), Brushes.Black, new PointF(20, 20));
如果不设置纸张大小,打印正常,
设置后打印出来的字体会变样,字体拉高了,而且在Y轴方向全被放大了,包括位置,也即定点打印时,同样的X和Y值,Y轴方向要离左上角原点(0,0)远的多。
但是直接打印成PDF文件,再用这个PDF文件打印又是正常的,搞了很长的时间,一直搞不定,请高手赐教!!

急急急!!!
...全文
4997 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
waiyzm 2011-01-04
  • 打赏
  • 举报
回复
还是不行啊,请问怎么在正在打印的过程中重新定义纸张的大小呢?
xixihaha_2011_098 2011-01-03
  • 打赏
  • 举报
回复
建议使用打印控件。用模板来控制
http://download.csdn.net/source/2866397
zjzhong 2010-09-03
  • 打赏
  • 举报
回复
高手何在?
jointan 2010-09-01
  • 打赏
  • 举报
回复
是放到针式打印机上用后进纸链去打印吗?

如果是激光的,修改纸张宽度试试,看左右位置是否正常
zjzhong 2010-09-01
  • 打赏
  • 举报
回复
可是俺在WORD2003中,页面设置选自定义纸张,很轻易地就设置并打印成功了,怎么会是不可以自定义纸张呢?
jointan 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zjzhong 的回复:]
WORD怎么可以随意自定义纸张呢?在服务器属性中添加的缺陷是显而易见,这不是俺要的办法
[/Quote]
和你说,你不相信,你可以做一个试验,你新建一个Work多页文档,把页面设置改为自定义,纸张修改一下纸张高度,选择链式进纸,放到针式打印机上用后进纸链去打印,你看看打印出的切纸位置正确吗?

事实上证明,WORD在NT系列的系统下也是不可以自定义纸张的.

不相信的都可以去试验一下
jointan 2010-09-01
  • 打赏
  • 举报
回复
检查自定义纸张设置是否被打印机应用,对于针式打印机,需要看链式进纸的切纸位置是否正常(因为左固定,上上不固定)
激光打印机,需要看页面的左边距是否正常(横中固定,不存在切纸,也就不存在上下坐标归位固定问题)
对于单边固定的喷墨打印机,没法测试(因为他的左坐标固定,不存在切纸,也不存在上下坐标归位固定)

我测试的结果如下:在WORD2003中,当选择的自定义纸张设置与可选的已定义纸张差距太远时(比如打印票据用的三刀链纸),WORD会以A4的页面执行打印,即打印完成后,切纸归位后,导致打印纸被拉出A4长度.而不是9.31CM.

MFC中,修改DEVMODE的方式也试过,执行结果也是由打印机选择预定义表单中与自定义表单最接近的表单定义

完全支持自定义纸张大小的软件多的是,但我测试证明WORD和Excel都不是,你可以试试,许多公司用的系统集成和ERP都是完全支持自定义纸张大小的(由于印刷差别,必须支持运行时设定),也不需要人工在服务器属性中添加表单,它们用的方法是在打印前调用API:AddForm,打印结束后调用API:DeleteForm,所以在服务器属性中看不到他们的自定义表单
zjzhong 2010-08-31
  • 打赏
  • 举报
回复
望各位高手给俺一点思路
zjzhong 2010-08-31
  • 打赏
  • 举报
回复
人生如梦,你提到的DevMode,我倒是看到有SetHdevmode方法,俺再看看
zjzhong 2010-08-31
  • 打赏
  • 举报
回复
人生如梦,俺好像没搞明白你的意思,你这段代码有什么意义呢?
jointan 2010-08-31
  • 打赏
  • 举报
回复
假如某软件在执行打印过程中,调用过AddForm和DeleteForm,软件公司有义务告诉用户么?
porschev 2010-08-31
  • 打赏
  • 举报
回复
看看。。。。
zjzhong 2010-08-31
  • 打赏
  • 举报
回复
WORD怎么可以随意自定义纸张呢?在服务器属性中添加的缺陷是显而易见,这不是俺要的办法
wuyq11 2010-08-31
  • 打赏
  • 举报
回复
在WIN98下,可以直接调用PAPERSIZE方法来执行,但是在NT、2000、XP下,纸张的大小由DevMode结构的四个属性决定
使用这种方法设置
public void print()
{
rowcount = 0;//记录数据的行数
string paperName = Page_Size(PageSheet);//获取当前纸张的大小
PageSettings storePageSetting = new PageSettings();//实列化一个对PageSettings对象
foreach (PaperSize ps in printdocument.PrinterSettings.PaperSizes)//查找当前设置纸张
{ if (paperName == ps.PaperName)
{
storePageSetting.PaperSize = ps;
break;
}}
try
{
printdocument.DefaultPageSettings.Landscape = PageScape;//设置横向打印
pagesetupdialog.Document = printdocument;
printpreviewdialog.ShowDialog();//显示打印预览窗体
}
catch(Exception e)
{
throw new Exception("printer error." + e.Message);
}
}
jointan 2010-08-31
  • 打赏
  • 举报
回复
NT,2000,XP,2003....下不能用DefaultPageSettings.PaperSize = new PaperSize("Custom", 826, 492)这种方式定义纸张大小,Win98可以

你需要在服务器属性中添加自定义表单,然后用
             foreach (PaperSize paperSize in printDoc.PrinterSettings.PaperSizes)
{
if (paperSize.PaperName == "自定义表单名称" && paperSize.Height == width && paperSize.Height == height)
{

printDoc.DefaultPageSettings.PaperSize = paperSize;
break;
}
}
这种方式来设置自定义纸张
zjzhong 2010-08-31
  • 打赏
  • 举报
回复
WORD、PDF、什么软件打印都没问题,不可能是驱动的问题
龍月 2010-08-31
  • 打赏
  • 举报
回复
重装驱动。
硬件问题吧

110,580

社区成员

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

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

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