如何通过一次单击打印两个图像,但每个图像在其自己的页面上

时间:2014-12-02 23:44:30

标签: c# asp.net webpage

我正在构建一个ASP网站页面,上面有两个图像:

<asp:Image ID="ImgPg1" runat="server" ImageUrl="Page1.ashx" />
<asp:Image ID="ImgPg2" runat="server" ImageUrl="Page2.ashx" />

我想一键打印两张图片。

Page1.ashx上的图片需要在第1页上打印,Page2.ashx上的图片需要在第2页上打印。

如何每页打印一张图片?

这就是我所做的,但我发现PrintDocument在服务器端运行,因此出现错误,说“找不到打印机”。下面的代码示例将一个矩形打印为测试,但无论如何它都是.ashx页面上的。

    protected void Print_Click(object sender, EventArgs e)
    {
        // Page.ClientScript.RegisterClientScriptBlock(GetType(), "Print CI", "window.print()", true);

        PrintDocument pd = new PrintDocument();
        pd.DefaultPageSettings.Landscape = false; 
        nPage = 0;
        pd.PrintPage += new PrintPageEventHandler(printImages);

        pd.Print();

    }

    private void printImages(object sender, PrintPageEventArgs ev)
    {
        Rectangle rect = new Rectangle(0, 0, 353, 230);        // 0.236 Inches @ 96 dpi = 23

        switch (nPage)
        {
            case 0:     // Page 1 just for test
                ev.Graphics.FillRectangle(new SolidBrush(Color.LightGray), rect);
                ev.Graphics.DrawRectangle(new Pen(Color.Black, 1), rect);
                break;
            case 1:     // Page 2 just for test
                rect = new Rectangle(360, 0, 353, 230);
                ev.Graphics.FillRectangle(new SolidBrush(Color.LightPink), rect);
                ev.Graphics.DrawRectangle(new Pen(Color.Black, 1), rect);
                break;
        }

        ++nPage;
        if (nPage < 2)
            ev.HasMorePages = true;
        else
            ev.HasMorePages = false;

    }

我需要每页打印一个图像的原因是因为一个图像是表单的前面而另一个图像是它的后面。图像尺寸小于8.5 x 11张(约1/4张)。

谢谢, 巴勃罗

2 个答案:

答案 0 :(得分:2)

您是否真的想要以编程方式将内容发送到打印机?除非有一个很好的商业理由,我认为最好的情况是将.ashx页面创建为打印友好页面,除了上面的两个图像,然后让用户从浏览器打印页面

但是......要回答你的实际问题,为了确保两张图片在不同的页面上打印,你可以在两者之间使用CSS分页符。

.PageBreak {
   page-break-after: always;
}

<asp:Image ID="ImgPg1" runat="server" ImageUrl="Page1.ashx" CssClass="PageBreak" />
<asp:Image ID="ImgPg2" runat="server" ImageUrl="Page2.ashx" />

这将强制打印机在第一张图像之后和第二张图像之前送入一张新纸。假设图像大小适合8.5 x 11张纸,这应该可以正常工作。

有关分页符的更多信息: http://www.w3schools.com/cssref/pr_print_pageba.asp

此外,很多伟大的.ashx提示: http://www.dotnetperls.com/ashx

告诉我们它是怎么回事!

答案 1 :(得分:1)

凯西的回答帮了很多忙。这是最终结果。

标题代码:

<script type="text/javascript">
    function printCI() {
        var printWindow = window.open('', 'CI', 'height=600,width=800');

        printWindow.document.write('<html><head><title>CI Form</title>');
        printWindow.document.write('<style>.PageBreak{page-break-after: always;}</style>');
        printWindow.document.write('</head><body >');
        printWindow.document.write('<div class=\'PageBreak\'><img src=\'Page1.ashx\' /></div>');
        printWindow.document.write('<div><img src=\'Page2.ashx\' /></div>');
        printWindow.document.write('</body></html>');
        printWindow.document.close();
        printWindow.print();
    }
</script>    

CS代码:

protected void Print_Click(object sender, EventArgs e)
{
    // Print CI with a javascript so we can print in two pages
    Page.ClientScript.RegisterClientScriptBlock(GetType(), "Print CI", "printCI()", true);
}