【问题标题】:Print FixedDocument with multiple FixedPage in pages per sheet in WPF在 WPF 中以每张纸的页数打印多个 FixedPage 的 FixedDocument
【发布时间】:2017-04-17 08:08:53
【问题描述】:

我有一个非常简单的 WPF 应用程序,上面只有一个按钮。

<Button x:Name="btnPrintCard" Grid.Row="2" HorizontalAlignment="Center" Content="Print Card" MinWidth="140" Foreground="White"
                Cursor="Hand" Background="#008080" Click="btnPrintCard_Click" />

我正在尝试在典型 A4 页面上打印多张尺寸为 3.370 x 2.125 的卡片。 如果安排得当,从左到右的顺序,每张纸应该适合 10 张卡片。就像 adobe reader 打印命令并将每张自定义页面设置为 2 x 5。

我正在使用以下代码生成和打印卡片:

private void btnPrintCard_Click(object sender, RoutedEventArgs e)
{
    try
    {
        PrintDialog printDialog = new PrintDialog();
        bool? pdResult = printDialog.ShowDialog();
        if (pdResult != null && pdResult.Value)
        {
            FixedDocument document = CreateFixedDocument();
            printDialog.PrintDocument(document.DocumentPaginator, "ID Card Printing");
        }
        MessageBox.Show("Printing done.");
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message + " :: " + ex.InnerException);
    }
}

private FixedDocument CreateFixedDocument()
{
    FixedDocument fixedDocument = new FixedDocument();
    // fixedDocument.DocumentPaginator.PageSize = new Size(96 * 3.370, 96 *2.125);
    fixedDocument.DocumentPaginator.PageSize = new Size(96 * 8.5, 96 * 11);

    for (int i = 0; i < 10; i++)
    {
        PageContent page = new PageContent();
        FixedPage fixedPage = CreateOneFixedPage();
        ((IAddChild)page).AddChild(fixedPage);
        fixedDocument.Pages.Add(page);
    }
    return fixedDocument;
}

private FixedPage CreateOneFixedPage()
{
    FixedPage page = new FixedPage();
    page.Background = Brushes.Red;
    page.Width = 96 * 3.370;
    page.Height = 96 * 2.125;

    TextBlock tbTitle = new TextBlock();
    tbTitle.Text = "xxx xxxxx Public School";
    tbTitle.FontSize = 24;
    tbTitle.Foreground = new SolidColorBrush(Colors.White);
    tbTitle.FontFamily = new FontFamily("Arial");
    FixedPage.SetLeft(tbTitle, 96 * 0.4); // left margin
    FixedPage.SetTop(tbTitle, 96 * 0.04); // top margin
    page.Children.Add((UIElement)tbTitle);

    Image image = new Image
    {
        Source = new BitmapImage(new Uri("http://www.ready-range.co.uk/_assets/images/products/BHSRR40R0R.jpg")),
        Height = 30,
        Width = 30
    };

    Border b = new Border();
    b.BorderThickness = new Thickness(1);
    b.BorderBrush = Brushes.Yellow;
    b.Child = image;

    FixedPage.SetLeft(b, 96 * 0.3);
    FixedPage.SetTop(b, 96 * 0.6); // top margin
    page.Children.Add((UIElement)b);

    //measure size of the layout
    Size sz = new Size(96 * 3.370, 96 * 2.125);
    page.Measure(sz);
    page.Arrange(new Rect(new Point(), sz));
    page.UpdateLayout();

    return page;
}

这会导致打印成功,但每页每张卡片都是这样的:

问题是我想像上面第一张图片一样打印,即每张纸自定义 2 x 5。

非常感谢。

【问题讨论】:

    标签: c# wpf printing


    【解决方案1】:

    This answer 来自另一个 stackoverflow 问题有很大帮助。为了得到想要的结果,我做了一些更改,在WpfPrint 类中添加了我自己的方法。

    /// <summary>
    /// Add fixed page to current fixed document
    /// </summary>
    /// <param name="card"></param>
    /// <param name="flags"></param>
    public void AddFixedPage(FixedPage card, ElementFlags flags)
    {
        card.Measure(_infiniteSize);
        if (CurX > _fixedDocument.DocumentPaginator.PageSize.Width - MarginX)
        {
            CurY += card.DesiredSize.Height + MarginY;
            CurX = MarginX;
        }
        double extraCheck = 0;
        if ((flags & ElementFlags.BottomCheck2) == ElementFlags.BottomCheck2)
            extraCheck = card.DesiredSize.Height;
        if (CurY > _fixedDocument.DocumentPaginator.PageSize.Height - MarginY - extraCheck)
            StartPage();
    
    
        _curCanvas.Children.Add(card);
        card.SetValue(Canvas.LeftProperty, CurX);
        card.SetValue(Canvas.TopProperty, CurY);
    
    
        CurX += card.DesiredSize.Width + MarginX; //Added margin x for proper display             
    
        if (((flags & ElementFlags.NewLine) == ElementFlags.NewLine)  || CurX + card.DesiredSize.Width > _fixedDocument.DocumentPaginator.PageSize.Width) 
        {
            CurX = MarginX;
            CurY += card.DesiredSize.Height + MarginY;
        }
    }
    

    现在我们可以简单地这样做:

    WpfPrint printer = new WpfPrint(new Size(96 * 9, 96 * 11));
    printer.CurrentElementMargin = new Thickness(4);
    printer.CurrentFontFamily = new FontFamily("Arial");
    printer.MarginX = 20;
    printer.MarginY = 10;
    

    现在我们可以遍历每个 FixedPage:

     for (int i = 0; i < 10; i++)
        printer.AddFixedPage(CreateOneFixedPage(), WpfPrint.ElementFlags.BottomCheck2);
    

    最后,像这样发送打印命令:

    PrintDialog printDialog = new PrintDialog();
    bool? pdResult = printDialog.ShowDialog();
    if (pdResult != null && pdResult.Value)                              
        printDialog.PrintDocument(printer.CurrentFixedDocument.DocumentPaginator, "Card Printing");
    

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      相关资源
      最近更新 更多