تبدیل PDF به تصویر با استفاده از API توکار Window 8.1 در برنامههای غیر مترو دات نت
نویسنده: وحید نصیری
تاریخ: ۱۳۹۳/۰۷/۰۱ ۱۴:۵۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
<PropertyGroup>
<TargetFrameworkVersion>v4.5.1</TargetFrameworkVersion>
<TargetPlatformVersion>8.1</TargetPlatformVersion>
</PropertyGroup> <ItemGroup>
<Reference Include="System" />
<Reference Include="System.ComponentModel.DataAnnotations" />
<Reference Include="System.Core" />
<Reference Include="System.ObjectModel" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="System.Threading" />
<Reference Include="System.Threading.Tasks" />
</ItemGroup>
<ItemGroup>
<Reference Include="Windows" />
<Reference Include="System.Runtime" />
<Reference Include="System.Runtime.WindowsRuntime" />
</ItemGroup> install-package Nito.AsyncEx
using System;
using System.IO;
using Windows.Storage.Streams;
namespace ConsoleWin81PdfApiTest
{
public static class MicrosoftStreamExtensions
{
public static IRandomAccessStream AsRandomAccessStream(this Stream stream)
{
return new RandomStream(stream);
}
}
class RandomStream : IRandomAccessStream
{
readonly Stream _internstream;
public RandomStream(Stream underlyingstream)
{
_internstream = underlyingstream;
}
public IInputStream GetInputStreamAt(ulong position)
{
_internstream.Position = (long)position;
return _internstream.AsInputStream();
}
public IOutputStream GetOutputStreamAt(ulong position)
{
_internstream.Position = (long)position;
return _internstream.AsOutputStream();
}
public ulong Size
{
get
{
return (ulong)_internstream.Length;
}
set
{
_internstream.SetLength((long)value);
}
}
public bool CanRead
{
get { return _internstream.CanRead; }
}
public bool CanWrite
{
get { return _internstream.CanWrite; }
}
public IRandomAccessStream CloneStream()
{
throw new NotSupportedException();
}
public ulong Position
{
get { return (ulong)_internstream.Position; }
}
public void Seek(ulong position)
{
_internstream.Seek((long)position, SeekOrigin.Begin);
}
public void Dispose()
{
_internstream.Dispose();
}
public Windows.Foundation.IAsyncOperationWithProgress<IBuffer, uint> ReadAsync(IBuffer buffer, uint count, InputStreamOptions options)
{
return GetInputStreamAt(Position).ReadAsync(buffer, count, options);
}
public Windows.Foundation.IAsyncOperation<bool> FlushAsync()
{
return GetOutputStreamAt(Position).FlushAsync();
}
public Windows.Foundation.IAsyncOperationWithProgress<uint, uint> WriteAsync(IBuffer buffer)
{
return GetOutputStreamAt(Position).WriteAsync(buffer);
}
}
} using System;
using System.IO;
using System.Threading.Tasks;
using Windows.Data.Pdf;
using Nito.AsyncEx;
namespace ConsoleWin81PdfApiTest
{
class Program
{
static void Main(string[] args)
{
AsyncContext.Run(async () =>
{
await test();
});
}
private static async Task test()
{
using (var randomAccessStream = File.Open("PieChartPdfReport.pdf", FileMode.Open).AsRandomAccessStream())
{
var pdfDocument = await PdfDocument.LoadFromStreamAsync(randomAccessStream);
for (uint i = 0; i < pdfDocument.PageCount; i++)
{
using (var page = pdfDocument.GetPage(i))
{
/*var renderOptions = new PdfPageRenderOptions
{
BackgroundColor = Colors.LightGray,
DestinationHeight = (uint) (page.Size.Height*10)
};*/
using (var stream = File.Open(string.Format("page-{0}.png", i + 1), FileMode.OpenOrCreate).AsRandomAccessStream())
{
await page.RenderToStreamAsync(stream/*, renderOptions*/);
await stream.FlushAsync();
}
}
}
}
}
}
} private async Task<List<System.Windows.Media.Imaging.BitmapImage>> getPdfPageImages()
{
var results = new List<System.Windows.Media.Imaging.BitmapImage>();
using (var randomAccessStream = File.Open("PieChartPdfReport.pdf", FileMode.Open).AsRandomAccessStream())
{
var pdfDocument = await PdfDocument.LoadFromStreamAsync(randomAccessStream);
for (uint i = 0; i < pdfDocument.PageCount; i++)
{
using (var memoryStream = new MemoryStream())
{
using (var stream = memoryStream.AsRandomAccessStream())
{
using (var page = pdfDocument.GetPage(i))
{
// Set render options
var renderOptions = new PdfPageRenderOptions
{
BackgroundColor = Colors.LightGray,
DestinationHeight = (uint)(page.Size.Height * 10)
};
await page.RenderToStreamAsync(stream); //, renderOptions);
await stream.FlushAsync();
var bitmapImage = new System.Windows.Media.Imaging.BitmapImage();
bitmapImage.BeginInit();
//Without this, BitmapImage uses lazy initialization by default and the stream will be closed by then.
bitmapImage.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
bitmapImage.StreamSource = memoryStream;
bitmapImage.EndInit();
results.Add(bitmapImage);
}
}
}
}
}
return results;
} private async void Button_Click(object sender, RoutedEventArgs e)
{
var images = await this.getPdfPageImages();
ImagePdf.Source = images.First();
}