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);
}
下面为主要代码,当电脑没有安装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
相关阅读 更多
热门阅读
- office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
- 如何安装mysql8.0
阅读:31
- Word快速设置标题样式步骤详解
阅读:28
- 20+道必知必会的Vue面试题(附答案解析)
阅读:37
- HTML如何制作表单
阅读:22
- 百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
- ET文件格式和XLS格式文件之间如何转化?
阅读:24
- react和vue的区别及优缺点是什么
阅读:121
- 支付宝人脸识别如何关闭?
阅读:21
- 腾讯微云怎么修改照片或视频备份路径?
阅读:28