Since this code was going to serve the thumbnail file from a web server, I needed to file to be ready before delivering the web response. I had to wait until the event fired--a sort of "re-synchronization" or "de-asynchronization", if you will.
Enter the ManualResetEvent. With some blogger help, I was able to put together the following:
using System; using System.Drawing; using System.Drawing.Imaging; using System.Threading; // http://code.google.com/p/pdfviewer-win32 using PDFLibNet; namespace InSite.Portal.Helpers { public class PdfHelper { PDFWrapper _pdf; public PdfHelper(string sourceFilePath) { _pdf = new PDFWrapper(); _pdf.LoadPDF(sourceFilePath); } public void SavePageAsImage(string destFilePath, int page) { SavePageAsImage(destFilePath, page, ImageFormat.Png); } public void SavePageAsImage(string destFilePath, int page, ImageFormat format) { ManualResetEvent _mre = new ManualResetEvent(false); var renderPageThumbnailFinished = new RenderNotifyFinishedHandler((i, s) => { _mre.Set(); }); var pg = _pdf.Pages[page]; pg.RenderThumbnailFinished += renderPageThumbnailFinished; var h = Convert.ToInt32(pg.Height); // get height var w = Convert.ToInt32(pg.Width); // get width var bmp = pg.LoadThumbnail(w, h); // call thumbnail render _mre.WaitOne(30 * 1000, true); // wait until render complete (30 sec timeout) bmp.Save(destFilePath, format); // save completed image pg.RenderThumbnailFinished -= renderPageThumbnailFinished; } public int PageCount { get { return _pdf.PageCount; } } } }
Crude? Elegant? Either way, it gets the job done.
No comments:
Post a Comment