C# 如何在Windows 8.1应用程序中打印多页大型位图而不耗尽内存

C# 如何在Windows 8.1应用程序中打印多页大型位图而不耗尽内存,c#,printing,windows-8,bitmap,windows-8.1,C#,Printing,Windows 8,Bitmap,Windows 8.1,我正在尝试从Windows 8.1应用程序打印带有自定义注释/布局的大型PDF文件。 我已经通过使用PrintDocument实现了打印,就像在Microsoft示例项目中以及上的示例中一样 基本上,我为PDF的每个页面生成UIElement,该页面上有一个用于渲染PDF位图的图像控件,以及一个画布,用于使用BuildPageAsync(pageNumber)保存的图形。我正在使用一个第三方库,它将PDF呈现为位图 我可以使它们以较小的分辨率渲染,但这不是一个可接受的解决方案 /// &

我正在尝试从Windows 8.1应用程序打印带有自定义注释/布局的大型PDF文件。 我已经通过使用PrintDocument实现了打印,就像在Microsoft示例项目中以及上的示例中一样

基本上,我为PDF的每个页面生成UIElement,该页面上有一个用于渲染PDF位图的图像控件,以及一个画布,用于使用BuildPageAsync(pageNumber)保存的图形。我正在使用一个第三方库,它将PDF呈现为位图

我可以使它们以较小的分辨率渲染,但这不是一个可接受的解决方案

    /// <summary>
    /// Occurs when the PrintManager requests the final collection of pages to send to the printer (user clicks PRINT button)
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void printDocument_AddPages(object sender, AddPagesEventArgs e)
    {
        this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
            {
                for (int i = 0; i < _pageNumberList.Count; i++)
                {
                    _printDocument.AddPage(await BuildPageAsync(_pageNumberList[i]));
                }
                _printDocument.AddPagesComplete();
            }
        );
    }
//
///当PrintManager请求将最终页面集合发送到打印机时发生(用户单击“打印”按钮)
/// 
/// 
/// 
作废打印文档\添加页面(对象发送者,添加页面七个字符e)
{
this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,async()=>
{
对于(int i=0;i<\u pageNumberList.Count;i++)
{
_AddPage(等待BuildPageAsync(_pageNumberList[i]);
}
_printDocument.AddPagesComplete();
}
);
}
这适用于较小的PDF。但是,对于具有大量页面的PDF,呈现所有要发送到PrintDocument的位图会导致系统内存不足,从而导致生成的打印作业具有空白页面

是否有方法将成批的页面发送到PrintDocument,然后处理使用过的页面,或者在Windows 8.1中使用C#按需呈现/准备UIElement页面

提前感谢您的帮助/建议


更新:显然,在Channel 9上打印视频的介绍中说,要打印文档和图像(真正的打印),我需要使用DirectX和C++::

有没有办法在我的C#和XAML应用程序中实现这一点?下面是C++的示例:


更新2:为了进一步澄清,是否可以对实际打印执行与获取打印预览页相同的操作(一次请求一页)

    /// <summary>
    /// Occurs when the PrintManager requests a particular print page to be shown in the preview
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void printDocument_GetPreviewPage(object sender, GetPreviewPageEventArgs e)
    {
        this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
            async () =>
            {
                var pageNumber = _pageNumberList[e.PageNumber - 1]; //get the actual page number from the list based on the requested page number
                var previewPage = await BuildPageAsync(pageNumber); //get the page here (possibly release other pages if they are not needed)
                _printDocument.SetPreviewPage(e.PageNumber, previewPage);
            });
    }
//
///当PrintManager请求在预览中显示特定打印页面时发生
/// 
/// 
/// 
私有void打印文档\u GetPreviewPage(对象发送者,GetPreviewPageEventArgs e)
{
this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
异步()=>
{
var pageNumber=_pageNumberList[e.pageNumber-1];//根据请求的页码从列表中获取实际页码
var previewPage=await BuildPageAsync(pageNumber);//在此处获取页面(如果不需要,可能释放其他页面)
_printDocument.SetPreviewPage(如页码、previewPage);
});
}

更新3:以下是一些有关MSDN的论坛帖子,但没有得到回复:



更新4:由于目前在这里和MSDN上都没有答案,因此限制打印页数似乎是最好的选择

你能把位图保存到磁盘上吗?然后分包打印,比如,第1页到第5页,第6页到第10页。。。每次的页数取决于位图大小。定义允许的最大位图包大小。@dcdroid关于这方面的进展,我有一个相关问题要问您。你能通过我个人资料中的地址给我发电子邮件吗?这样我就可以脱机讨论了?谢谢嗨,你最后运气好吗?我正在尝试做类似的事情。如果您能与我们分享您的解决方案,我将不胜感激。Thanks@Sean不幸的是,这似乎是用C语言打印Windows8应用程序的唯一方法#