使用多种页面大小的PrintDocument

本文关键字:PrintDocument | 更新日期: 2023-09-27 18:18:05

在。net 3.5中工作。

简介:

试图复制现有第三方组件的功能,该组件在Windows 7中失效。到目前为止,用户可以选择一堆要打印的图像文件,为每个图像指定一个页面大小,然后将它们发送出去一次性打印。我迫切需要一个关于如何在打印每页时切换页面大小的概念解释。

到目前为止,我已经弄清楚如何打印多个图像都具有相同的页面大小。我使用图像列表并使用PrintDocument对象,将PrintPageEventArgsHasMorePages属性设置为true,直到我到达列表的末尾。

下面是我快速拼凑的一个类来测试:
public partial class Form1 : Form
{
    private List<Image> images { get; set; }
    private PrintDocument printDocument { get; set; }
    public Form1()
    {
        InitializeComponent();
        this.images = new List<Image>();
        this.images.Add(Image.FromFile(@"C:'test60.bmp"));
        this.images.Add(Image.FromFile(@"C:'SuperLargeTest.jpg"));
        this.printDocument = new PrintDocument()
        {
            PrinterSettings = new PrinterSettings()
        };
        this.printDocument.PrintPage += printDocument_PrintPage;
    }
    private void printDocument_PrintPage(object sender, PrintPageEventArgs e)
    {
        Graphics g = e.Graphics;
        e.PageSettings.PaperSize = this.paperSizes[this.currentImageIndex];
        RectangleF marginBounds = e.MarginBounds;
        RectangleF printableArea = e.PageSettings.PrintableArea;
        int availableWidth = (int)Math.Floor(printDocument.OriginAtMargins ? marginBounds.Width : (e.PageSettings.Landscape ? printableArea.Height : printableArea.Width));
        int availableHeight = (int)Math.Floor(printDocument.OriginAtMargins ? marginBounds.Height : (e.PageSettings.Landscape ? printableArea.Width : printableArea.Height));
        g.DrawRectangle(Pens.Red, 0, 0, availableWidth - 1, availableHeight - 1);
        g.DrawImage(this.images[currentImageIndex], printableArea);
        e.HasMorePages = ++currentImageIndex < this.images.Count();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        this.printDocument.OriginAtMargins = false;
        this.printDocument.Print();
    }
}

我真的弄不明白的是如何去改变页面大小,比如说,第二张图片。如果我想把第一张图片打印成A4,然后把第二张打印成A3,我该怎么做呢?

我在这里发现了这个SO问题,它似乎建议改变PrintPageEventArgs中的PageSize,但没有快乐。

我还尝试使用QueryPageSettingsEventArgs事件并设置PageSettings在那里,但这似乎也不起作用…

我想实现的是打印不同大小的多个页面作为一个单一的文件。任何建议,链接,解释,示例代码将非常感激。

c#或VB中的任何东西。

使用多种页面大小的PrintDocument

这也是我的工作。

翻译成c#:

    private bool SetPaperSize(PrintDocument pd, PaperKind nKind)
    {
        foreach(System.Drawing.Printing.PaperSize ps in pd.PrinterSettings.PaperSizes)
        {
            if (ps.Kind == nKind)
            {
                pd.DefaultPageSettings.PaperSize = ps;
                return true;
            }
        }
        return false;
    }

在VB中。网你可以使用Sub ..

DocPrint是PrintDocument var

Sub SetPaperSize(ByVal nKind As PaperKind)
        Dim ps As PaperSize
        For ix As Integer = 0 To DocPrint.PrinterSettings.PaperSizes.Count - 1
            If DocPrint.PrinterSettings.PaperSizes(ix).Kind = nKind Then
                ps = DocPrint.PrinterSettings.PaperSizes(ix)
                DocPrint.DefaultPageSettings.PaperSize = ps
            End If
        Next
    End Sub

如果您希望所有页面显示为一个作业(简而言之,避免与其他作业交错),您可以通过更改PrintDocument对象的默认页面大小在PrintPage事件处理程序中设置下一页的页面大小。