0

在 .NET 3.5 中工作。

概括:

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

细节

到目前为止,我已经弄清楚如何打印多个具有相同页面大小的图像。我使用图像列表并使用PrintDocument对象,将HasMorePages属性设置PrintPageEventArgs为 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 question,它似乎建议更改PageSize中的PrintPageEventArgs,但在那里没有任何乐趣。

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

我想要实现的是将多个不同大小的页面打印为一个文档。任何建议、链接、解释、示例代码将不胜感激。

C# 或 VB.NET 中的任何内容都可以。

4

3 回答 3

2

这对我也有用。

翻译成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;
    }
于 2014-01-07T10:43:53.807 回答
1

在 VB.NET .. 你可以使用这个 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

希望这有帮助..

于 2013-06-12T13:29:38.803 回答
0

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

于 2017-05-11T15:08:22.353 回答