从UWA打印多个页面

时间:2016-03-24 18:41:25

标签: c# printing win-universal-app printdocument .net-4.6

我有大约8条记录,我想在一个批次中打印,每个记录都在一个单独的页面上。但是,UWP样本使用了600多行代码来完成它。在我看来,它必须比那更容易。我认为我们所要做的就是将每个页面添加到PrintDocument并发送打印作业。显然不是。我正在使用这个:

async void Print()
{
    var printDocument = new PrintDocument();
    var printDocumentSource = printDocument.DocumentSource;
    var printMan = PrintManager.GetForCurrentView();
    printMan.PrintTaskRequested += PrintTaskRequested;

    var pages = new List<Page>();

    foreach (var item in items)
    {
        (//Set up variables)

        var printPage = new PageToPrint() { //Set properties };
        printPage.Set_Up();  //Set up fields

        pages.Add(printPage);
    }

    printDocument.SetPreviewPage(1, page);
    printDocument.SetPreviewPageCount(pages.Count, PreviewPageCountType.Final);

    foreach (var page in pages)
    {
        printDocument.AddPage(page);
    }

    printDocument.AddPagesComplete();
    await PrintManager.ShowPrintUIAsync();
}

void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs e)
{
    PrintTask printTask = null;
    printTask = e.Request.CreatePrintTask("Kimble Print Job", sourceRequested =>
    {
        printTask.Completed += PrintTask_Completed;
        sourceRequested.SetSource(printDocumentSource);
    });
}

private async void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args)
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        PrintManager printMan = PrintManager.GetForCurrentView();
        printMan.PrintTaskRequested -= PrintTaskRequested;
    });
}

但是,它不会生成打印预览。它只是坐在那里旋转和旋转,如果我点击“打印”它没有成功(PDF无法打开,作业永远不会到达物理打印机。)

我希望使用PrintDocument打印至少合理,我仍然认为它看起来应该是这样。我在这里错过了它,还是真的需要600多行代码来发送一个简单的打印作业?

1 个答案:

答案 0 :(得分:1)

  

但是,它不会生成打印预览。

这是因为setPreview方法printDocument.SetPreviewPage(1, page);必须放在printDocument.GetPreviewPage事件句柄中。所以你应该首先注册事件句柄。与printDocument.AddPages事件句柄相同。你把事件句柄寄存器和回调函数搞得一团糟。我对你的代码进行了一些改动,我测试它运行良好。

protected PrintDocument printDocument;
protected IPrintDocumentSource printDocumentSource;
List<Page> pages = new List<Page>();
Page printPage = new PageToPrint();
public MainPage()
{
    this.InitializeComponent();
    RegisterForPrinting();
}

private async void BtnPrint_Click(object sender, RoutedEventArgs e)
{
    await PrintManager.ShowPrintUIAsync();       
}

public void RegisterForPrinting()
{
    printDocument = new PrintDocument();
    printDocumentSource = printDocument.DocumentSource;
    pages.Add(printPage);
    printDocument.GetPreviewPage += GetPrintPreviewPage;
    printDocument.AddPages += AddPrintPages;
    PrintManager printMan = PrintManager.GetForCurrentView();
    printMan.PrintTaskRequested += PrintTaskRequested;
}
private void AddPrintPages(object sender, AddPagesEventArgs e)
{
    foreach (var page in pages)
    {
        printDocument.AddPage(page);
    }
    printDocument.AddPagesComplete();
}
private void GetPrintPreviewPage(object sender, GetPreviewPageEventArgs e)
{
    printDocument.SetPreviewPage(1, printPage);
    printDocument.SetPreviewPageCount(pages.Count, PreviewPageCountType.Final);
}

void PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs e)
{
    PrintTask printTask = null;
    printTask = e.Request.CreatePrintTask("Kimble Print Job", sourceRequested =>
    {
        printTask.Completed += PrintTask_Completed;
        sourceRequested.SetSource(printDocumentSource);
    });
}

private async void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args)
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        PrintManager printMan = PrintManager.GetForCurrentView();
        printMan.PrintTaskRequested -= PrintTaskRequested;
    });
} 

虽然您可能不需要示例的所有代码,但我建议您遵循official sample结构并构建PrintHelper类。