none
C#使用生成图片并打印的位置问题 RRS feed

  • 问题

  • http://developer.51cto.com/art/200908/146983.htm

    仿照上述示例做了个图片模板(PS中新建的是A4纸 72分辨率 2480x2508像素),并在PS中计算好需要填充内容的x/y轴位置,把相应的x/y坐标数值写入到cs代码中,然后用本机1440*900分辨率的笔记本、Canon MP230打印出来的位置是按正常的显示。

    现在客户那用同样分辨率的笔记本加其它品牌的打印机打印出来的内容字体及LOGO变的非常的大,靠左上显示,内空在A4纸上只显示一半。这是为什么,不能用像素定位,而改用Point吗?

     

    问:

    1、如何做到不管是什么打印机及分辨率都能显示正常,打印所有的内容?

    谢谢各位。

    2013年8月13日 7:52

答案

  • 请尝试一下用这个方法看看:

    private void my_print_document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    	Bitmap image = new Bitmap("test1.jpg");
    	
    	float quotient = 1;
    	float margin = 20;
    	float page_w = e.PageBounds.Width - (2 * margin);
    	float page_h = e.PageBounds.Height - (2 * margin);
    	if (image.Width >= image.Height)
    	{
    		quotient = page_w / image.Width;
    	}
    	if (image.Width < image.Height)
    	{
    		quotient =  image.Height / page_h;
    	}
    	float w = page_w;
    	float h = image.Height * quotient;
    	
    	e.Graphics.DrawImage(image, margin, margin, w, h);
    }

     


    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.


    2013年8月19日 13:01
    版主

全部回复

  • 你好!

    你可以尝试设置PrintDocument对象的DefaultPageSettings来设定一下页面尺寸,并且添加一个预览功能来作调试以避免浪费纸张。

    请参看以下代码:

    PrintPreviewDialog ppd = new PrintPreviewDialog();
                PrintDocument pd = new PrintDocument();
                PageSettings df = new PageSettings();
                //设置尺寸大小,如不设置默认是A4纸
                //A4纸的尺寸是210mm×297mm,
                //当你设定的分辨率是72像素/英寸时,A4纸的尺寸的图像的像素是595×842
                //当你设定的分辨率是150像素/英寸时,A4纸的尺寸的图像的像素是1240×1754
                //当你设定的分辨率是300像素/英寸时,A4纸的尺寸的图像的像素是2479×3508,
                df.PaperSize = new PaperSize("A4", 595, 842);
                //设置打印机分辨率            
                PrinterResolution pr = new PrinterResolution();
                pr.X = 600;
                pr.Y = 600;
                df.PrinterResolution = pr;
                pd.DefaultPageSettings = df;
                pd.PrintPage += pd_PrintPage;
                ppd.Document = pd;
                ppd.ShowDialog();

    笔记本的分辨率是一样的,但是打印机的分辨率是独立于电脑分辨率的,打印设置与电脑分辨率没有必然联系。你可以通过PrinterResolution属性来获取当前打印机的分辨率,看看是不是客户的打印机和你的打印机分辨率不一样。也可以通过这个类来设置打印机的分辨率为一致,这样打印效果应该就会一样了。


    Caillen
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年8月14日 13:19
    版主
  • 你好。谢谢回复。

    如果通过获取当前打印机的分辨率来更改打印文字所处的位置,那工作量不是很大?因为打印机的型号各式各样,我们也不太可能收集到所有打印机的分辨率并对所要打印的文字位置的像素定位。

    之前有朋友说不要用像素,而要用英寸或poin等在印刷中采用的定位,可如果我把下面代码中的

     e.Graphics.DrawImage(temp, destRect, 0, 0, temp.Width, temp.Height, System.Drawing.GraphicsUnit.Pixel);  

    System.Drawing.GraphicsUnit.Pixel改成System.Drawing.GraphicsUnit.Point或其它的,进行打印时会提示“代码未实现”的错误提示。

    大家能否帮忙下呢?谢谢了。

    2013年8月18日 13:51
  • 请尝试一下用这个方法看看:

    private void my_print_document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    	Bitmap image = new Bitmap("test1.jpg");
    	
    	float quotient = 1;
    	float margin = 20;
    	float page_w = e.PageBounds.Width - (2 * margin);
    	float page_h = e.PageBounds.Height - (2 * margin);
    	if (image.Width >= image.Height)
    	{
    		quotient = page_w / image.Width;
    	}
    	if (image.Width < image.Height)
    	{
    		quotient =  image.Height / page_h;
    	}
    	float w = page_w;
    	float h = image.Height * quotient;
    	
    	e.Graphics.DrawImage(image, margin, margin, w, h);
    }

     


    Caillen
    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.


    2013年8月19日 13:01
    版主