C#打印,打不全问题(100分,不够可以再加)

jtlyr 2010-05-04 11:15:45
我用C#的打印控件进行全纸打印(无边距),在打印事件中我取得打印纸张的大小,然后把图片打印出来,在预览状态下没有问题,但打印出来后右边少了大约1CM(A4纸)。
我分析了一下,大概有两种情况:
1.由于打印机不能实现无边距打印(打印出来后周围又一圈白边),实际打印区域比取得的区域要小所导致。

2.由于显示屏和打印机的打印DPI不同导致的差异。但我取得的打印尺寸时就是1/100英寸,而不是像素。
所以我觉得问题可能是第一种情况。

麻烦各位高手指点,分数不够我可以再加。
下面是我的代码:(打印事件)
private void printMyDocument(PrintPageEventArgs e)
{
Rectangle paperRect = e.MarginBounds;//单位是1/100英寸(1169*827),我算了一下,就是A4纸的尺寸(29.7*21cm)
...//一些check处理
Image image = getImage();//取得图片Image
if (image != null)
{
Graphics g = e.Graphics;
g.DrawImage(image, paperRect);
}
}
...全文
1185 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
jtlyr 2010-05-21
  • 打赏
  • 举报
回复
基本搞定。
原因如下:
即使把边距设为0, 打印机打出来一般都有个边,使用e.MarginBounds取得的是整个纸张的大小(含边距),要想取有效的打印区域,查了下msdn,发现使用visibleCIipBound(好像是这么写的,记不太准了)即可。
感谢各位的支持,准备结贴。
另外,关于这个问题,我准备过段时间把这个总结一下,写在blog上,给后用者提供个思路吧。
mayonglong 2010-05-09
  • 打赏
  • 举报
回复
友情帮顶~~~
jtlyr 2010-05-09
  • 打赏
  • 举报
回复
再顶,有经验者提提思路
jtlyr 2010-05-06
  • 打赏
  • 举报
回复
再顶顶,难道大家都没有遇到这样的问题吗?
没有比较好的解决方案吗?
Taiyangchen 2010-05-05
  • 打赏
  • 举报
回复
打印机再有问题也是可以通过代码去解决的!代码中可以调整的
k20002001 2010-05-05
  • 打赏
  • 举报
回复
我也遇到过类似的情况 是由楼主说的第一种情况引起的 ,需要手动设置打印边距才能打印完整.....
zgke 2010-05-05
  • 打赏
  • 举报
回复
不理解你的意思

。int _Width = e.PageBounds.Width;

decimal _DPI = (decimal)_Width / 8.26M;

默认情况下 DPI为100 你使用PrintDocumet打印的时候 会有默认有边局的
jtlyr 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 g394594141 的回复:]
如果打印不出来,你就在右边距给它设一定的值,我估计图片宽度超过了。以前用activereporter做的时候经常这样,只要你所画的范围超过了A4的范围就不能打印完
[/Quote]
我觉得可能是这样,因为我想全纸打印(无边距),所以不能打印不完全,如果我设定一定的页边距,就可以全部打印出来的,但这和我想要的无边距打印不太一致。
jtlyr 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 gz530 的回复:]
主要原因有两个:
第一、打印机的规则不是很正规,所以导致打印出来的图会和自己希望(应该是正常)的不一样,
第二、就是你的图片大小本来就有问题,图片大小本来就有误差

在我们的程序里,误差是在所难免的,这个可以通过代码解决,就像4楼说的,
[/Quote]

g.DrawImage(image, paperRect)方法中paperRect已经指定了输出区域,所以应该和原图片大小没有关系,如果原图片和paperRect大小不能严格一致,它会自动伸缩。

不知各位有没有比较成熟的解决方案。
g394594141 2010-05-05
  • 打赏
  • 举报
回复
如果打印不出来,你就在右边距给它设一定的值,我估计图片宽度超过了。以前用activereporter做的时候经常这样,只要你所画的范围超过了A4的范围就不能打印完
jtlyr 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 liuyu520hong 的回复:]
if (image != null)
{
Graphics g = e.Graphics;
g.DrawImage(image, paperRect);
}
}
g.DrawImage(image, paperRect);
这个方法里的paperRect使用的是像素,而且你获取的确是英寸,所以打印出来会有所不同,所以你可以调一下这个方法里的尺寸!
[/Quote]

g的pageUnit默认的是display(1/100英寸),不是像素吧?
I520WUCHAN 2010-05-05
  • 打赏
  • 举报
回复
关注中....
Flavoring 2010-05-05
  • 打赏
  • 举报
回复
主要原因有两个:
第一、打印机的规则不是很正规,所以导致打印出来的图会和自己希望(应该是正常)的不一样,
第二、就是你的图片大小本来就有问题,图片大小本来就有误差

在我们的程序里,误差是在所难免的,这个可以通过代码解决,就像4楼说的,
Flavoring 2010-05-05
  • 打赏
  • 举报
回复
主要原因有两个:
第一、打印机的规则不是很正规,所以导致打印出来的图会和自己希望(应该是正常)的不一样,
第二、就是你的图片大小本来就有问题,图片大小本来就有误差

在我们的程序里,误差是在所难免的,这个可以通过代码解决,就像4楼说的,
cjnkd 2010-05-05
  • 打赏
  • 举报
回复
帮顶一个
wangwenzhuang 2010-05-05
  • 打赏
  • 举报
回复
UP......
njw1028 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ahsun1987 的回复:]
打印机再有问题也是可以通过代码去解决的!代码中可以调整的
[/Quote]
我的打印机坏了。。。
liuyu520hong 2010-05-05
  • 打赏
  • 举报
回复
if (image != null)
{
Graphics g = e.Graphics;
g.DrawImage(image, paperRect);
}
}
g.DrawImage(image, paperRect);
这个方法里的paperRect使用的是像素,而且你获取的确是英寸,所以打印出来会有所不同,所以你可以调一下这个方法里的尺寸!
sxmonsy 2010-05-05
  • 打赏
  • 举报
回复
友情UP
huminghua 2010-05-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ahsun1987 的回复:]

打印机再有问题也是可以通过代码去解决的!代码中可以调整的
[/Quote]...............
加载更多回复(13)

111,077

社区成员

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

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

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