2017-04-17 107 views
0

我有一个非常简单的WPF应用程序,只有一个按钮。在WPF中打印每页固定页数的FixedDocument

<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张牌。酷似,土坯读者打印命令和每片设置自定义页面至2×5

Abode Reader print setting

我生成和印刷卡利用以下代码:

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; 
} 

它导致成功地打印但每页每张卡这样的:

Printed image

的问题是我想像上面第一张图像那样打印,即定制2每张5张。

很多谢谢。

回答

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; 

现在我们可以遍历每个固定页:

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"); 

谢谢。