PDFThumbnailCSharp
using System;using System.IO;using System.Drawing;using System.Configuration;using System.Windows.Forms;using System.Runtime.InteropServices;class PDFThumbnailCsharp{[STAThread]static void Main(string[] args){// Acrobat objectsAcrobat.CAcroPDDoc pdfDoc;Acrobat.CAcroPDPage pdfPage;Acrobat.CAcroRect pdfRect;Acrobat.CAcroPoint pdfPoint;AppSettingsReader appSettings = new AppSettingsReader();string pdfInputPath = appSettings.GetValue("pdfInputPath", typeof(string)).ToString();string pngOutputPath = appSettings.GetValue("pngOutputPath", typeof(string)).ToString(); string templatePortraitFile = Application.StartupPath @"\pdftemplate_portrait.gif";string templateLandscapeFile = Application.StartupPath @"\pdftemplate_portrait.gif";;try{// Get list of files to process from the input path // Could change to read list from database insteadstring[] files = Directory.GetFiles(pdfInputPath, "*.pdf");for (int n=0; n < files.Length; n ){string inputFile = files[n].ToString();string outputFile = pngOutputPath files[n].Substring(files[n].LastIndexOf(@"\") 1).Replace(".pdf", ".png"); /* Could skip if thumbnail already exists in output path FileInfo fi = new FileInfo(inputFile);if (!fi.Exists) {} */// Create the document (Can only create the AcroExch.PDDoc object using late-binding)// Note using VisualBasic helper functions, have to add reference to DLL in// C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\Microsoft.VisualBasic.dll// Will always be available as .NET framework ships with allpdfDoc = (Acrobat.CAcroPDDoc) Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.PDDoc", "");int ret = pdfDoc.Open(inputFile);if (ret == 0){throw new FileNotFoundException();}// Get the number of pages (to be used later if you wanted to store that information)int pageCount = pdfDoc.GetNumPages();// Get the first pagepdfPage = (Acrobat.CAcroPDPage)pdfDoc.AcquirePage(0);pdfPoint = (Acrobat.CAcroPoint)pdfPage.GetSize();pdfRect = (Acrobat.CAcroRect) Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.Rect", "");pdfRect.Left = 0;pdfRect.right = pdfPoint.x;pdfRect.Top = 0;pdfRect.bottom = pdfPoint.y;// Render to clipboard, scaled by 100 percent (ie. original size) // Even though we want a smaller image, better for us to scale in .NET // than Acrobat as it would greek out small text // see http://www.adobe.com/support/techdocs/1dd72.htmpdfPage.CopyToClipboard(pdfRect, 0, 0, 100);IDataObject clipboardData = Clipboard.GetDataObject();if (clipboardData.GetDataPresent(DataFormats.Bitmap)){Bitmap pdfBitmap = (Bitmap)clipboardData.GetData(DataFormats.Bitmap);// Size of generated thumbnail in pixelsint thumbnailWidth = 45;int thumbnailHeight = 59;string templateFile;// Switch between portrait and landscapeif (pdfPoint.x < pdfPoint.y){templateFile = templatePortraitFile;}else{templateFile = templateLandscapeFile;// Swap width and height (little trick not using third temp variable)thumbnailWidth = thumbnailWidth ^ thumbnailHeight;thumbnailHeight = thumbnailWidth ^ thumbnailHeight;thumbnailWidth = thumbnailWidth ^ thumbnailHeight;}// Load the template graphicBitmap templateBitmap = new Bitmap(templateFile);// Render to small image using the bitmap classImage pdfImage = pdfBitmap.GetThumbnailImage(thumbnailWidth, thumbnailHeight, null, IntPtr.Zero);// Create new blank bitmap ( 7 for template border) Bitmap thumbnailBitmap = new Bitmap(thumbnailWidth 7, thumbnailHeight 7,System.Drawing.Imaging.PixelFormat.Format32bppArgb);// To overlayout the template with the image, we need to set the transparency // http://www.sellsbrothers.com/writing/default.aspx?content=dotnetimagerecoloring.htmtemplateBitmap.MakeTransparent();using (Graphics thumbnailGraphics = Graphics.FromImage(thumbnailBitmap)){// Draw rendered pdf image to new blank bitmapthumbnailGraphics.DrawImage(pdfImage, 2, 2, thumbnailWidth, thumbnailHeight);// Draw template outline over the bitmap (pdf with show through the transparent area)thumbnailGraphics.DrawImage(templateBitmap, 0, 0);// Save as .png filethumbnailBitmap.Save(outputFile, System.Drawing.Imaging.ImageFormat.Png);Console.WriteLine("Generated thumbnail... {0}", outputFile);}pdfDoc.Close();// Not sure how why it is to do this, but Acrobat is not the best behaved COM object// see http://blogs.msdn.com/yvesdolc/archive/2004/04/17/115379.aspxMarshal.ReleaseComObject(pdfPage);Marshal.ReleaseComObject(pdfRect);Marshal.ReleaseComObject(pdfDoc);}}}catch (System.Exception ex){Console.Write(ex.ToString());}}}
评论