+ -
当前位置:首页 → 问答吧 → C#实现PDF文件转换为图片的一个问题

C#实现PDF文件转换为图片的一个问题

时间:2010-10-11

来源:互联网

需要引用两个连接库,1、Com组件Acrobat(Adobe Acrobat Professional);2、.Net组件Microdoft.VisualBasic。
下面为主要代码,当电脑没有安装Adobe Acrobat Professional软件时,程序运行到红色代码处会有异常:无法创建ActiveX组件,装上就正常了,
我现在就是想在不装的情况下也正常,Acrobat.dll已经引入进来 ,不过没有注册成com组件,我想是这个原因造成的,如果有方法可以把Acrobat.dll注册成com组件应该问题就解决了,

现在请问有没有高手知道解决方法的!

public class ConvertPdfToPicture
  {
  private Acrobat.CAcroPDDoc pdfDoc;
  private Acrobat.CAcroPDPage pdfPage;
  private Acrobat.CAcroRect pdfRect;
  private Acrobat.CAcroPoint pdfPoint;

  public ConvertPdfToPicture()
  {
  }

  public void ConvertToPicture(string[] pcFileNames)
  {
  try
  {
  //Pdf 文件数量判断
  for (int n = 0; n < 1; n++)
  {
  string lcFileName = pcFileNames[n].ToString();
  string lcOutPutFile = lcFileName.Replace(".pdf", "");

  pdfDoc = (Acrobat.CAcroPDDoc)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.PDDoc", ""); bool llRet = pdfDoc.Open(lcFileName);

  if (!llRet)
  {
  throw new FileNotFoundException();
  }

  int pageCount = pdfDoc.GetNumPages();
  for (int i = 0; i < pageCount; i++)
  {
  pdfPage = (Acrobat.CAcroPDPage)pdfDoc.AcquirePage(i);
  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;

  pdfPage.CopyToClipboard(pdfRect, 0, 0, 100);

  IDataObject loClipboardData = Clipboard.GetDataObject();
  if (loClipboardData.GetDataPresent(DataFormats.Bitmap))
  {
  Bitmap pdfBitmap = (Bitmap)loClipboardData.GetData(DataFormats.Bitmap);
  int loImgWidth = pdfPoint.x;
  int loImgHeight = pdfPoint.y;

  if (pdfPoint.x >= pdfPoint.y)
  {
  loImgWidth = loImgWidth ^ loImgHeight;
  loImgHeight = loImgWidth ^ loImgHeight;
  loImgWidth = loImgWidth ^ loImgHeight;
  }

  Bitmap loTemplateBitmap = new Bitmap(pdfPoint.x, pdfPoint.y);

  Image loPdfImage = pdfBitmap.GetThumbnailImage(loImgWidth, loImgHeight, null, IntPtr.Zero);

  Bitmap thumbnailBitmap = new Bitmap(loImgWidth + 7, loImgHeight + 7, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

  // http://www.sellsbrothers.com/writing/default.aspx?content=dotnetimagerecoloring.htm
  loTemplateBitmap.MakeTransparent();

  using (Graphics poGraphics = Graphics.FromImage(thumbnailBitmap))
  {
  poGraphics.DrawImage(loPdfImage, 2, 2, loImgWidth, loImgHeight);
  poGraphics.DrawImage(loTemplateBitmap, 0, 0);
  //保存图象文件
  string lcSaveFileName = lcOutPutFile + i.ToString() + ".png";
  thumbnailBitmap.Save(lcSaveFileName, System.Drawing.Imaging.ImageFormat.Png);
  }

  loTemplateBitmap.Dispose();
  loPdfImage.Dispose();
  thumbnailBitmap.Dispose();
  }
  }
  pdfDoc.Close();

  // see http://blogs.msdn.com/yvesdolc/archive/2004/04/17/115379.aspx
  Marshal.ReleaseComObject(pdfPage);
  Marshal.ReleaseComObject(pdfRect);
  Marshal.ReleaseComObject(pdfDoc);
  }
  }
  catch (Exception ex)
  {
  MessageBox.Show(ex.Message);
  }


作者: zc200819894   发布时间: 2010-10-11

来个人啊

作者: zc200819894   发布时间: 2010-10-14

想法太天真了,程序的COM组件需要其他的库支持啊.光拷贝个dll不行的.

作者: xxiju203   发布时间: 2010-10-15

热门下载

更多