打印BitmapImage的PDF / ObservableCollection

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打印BitmapImage的PDF / ObservableCollection相关的知识,希望对你有一定的参考价值。

我一直在阅读StackOverflows关于在UWP中打印PDF的限制。其中一个主题How to print PDF in UWP without loosing quality after rasterization to PNG很好地总结了它。

我采取了以下步骤来打印PDF文件的图像

  1. 从本地文件夹加载PDF StorageFile f = await Windows.Storage.ApplicationData.Current.LocalFolder.GetFileAsync("pdffile.pdf"); PdfDocument doc = await PdfDocument.LoadFromFileAsync(f); Load(doc);
  2. 将PDF转换为图像并将图像放入可观察的集合中并将其保存到本地文件夹中 async void Load(PdfDocument pdfDoc) { PdfPages.Clear(); for (uint i = 0; i < pdfDoc.PageCount; i++) { BitmapImage image = new BitmapImage(); var page = pdfDoc.GetPage(i); using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream()) { await page.RenderToStreamAsync(stream); await image.SetSourceAsync(stream); } PdfPages.Add(image); StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("pdffilepage" + i +".jpg"); var stream2 = await file.OpenStreamForWriteAsync(); var serializer = new DataContractSerializer(typeof(ObservableCollection<BitmapImage>)); serializer.WriteObject(stream2, PdfPages[(int)i]); await stream2.FlushAsync(); } Debug.WriteLine("Writing file finished"); }

在此步骤中,我收到以下错误:

System.Runtime.Serialization.InvalidDataContractException:“类型'Windows.UI.Xaml.Media.ImageSource'无法序列化。请考虑使用DataContractAttribute属性标记它,并使用DataMemberAttribute属性标记要序列化的所有成员。或者,您可以确保类型是公共的并且具有无参数构造函数 - 然后将序列化该类型的所有公共成员,并且不需要任何属性。“

我不知道如何处理上面提到的错误。

答案

异常消息已经清楚地解释了。你无法序列化ImageSource的类型。

如果要将BitmapImage保存到StorageFile中,可以使用BitmapDecoderBitmapEncoderWriteableBitmap

有关更多详细信息,请参阅此主题:Storing a BitmapImage in LocalFolder - UWP

以上是关于打印BitmapImage的PDF / ObservableCollection的主要内容,如果未能解决你的问题,请参考以下文章

Windows Phone - 裁剪 BitmapImage [关闭]

win10 uwp 读取保存WriteableBitmap BitmapImage

BitMapImage 到字节和反转

Windows 8 如何将 BitmapImage 作为流打开?

Silverlight 4 BitmapImage - bmp 文件支持

将BitmapImage转换为System.Windows.Media.Brush