C# 一个把PDF页转换成Bitmap后保存到本地bmp图片的程序,执行多次后,写入速度变慢

csczh 2018-12-14 10:15:39
C#下调用Acrobat的组件,for循环一直从PDF文件中取出一页转换成Bitmap最后保存到本地图片。
刚开始能够保持每秒8到9张的速度,每张图片8M左右。保持到2000多张的时候,每秒大概只能保存1到2张。
内存关闭内存分页,只用物理内存,内存占用也一直保持在10%多。


Acrobat.CAcroPDPage pdfPage = null;
Acrobat.CAcroPoint pdfPoint = null;
Acrobat.CAcroRect pdfRect = null;
Acrobat.CAcroPDDoc doc = (Acrobat.CAcroPDDoc)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.PDDoc", "");

Bitmap bitmap = null;
for (curPDFIdx = 0; curPDFIdx < PD.PlateList.Count; ++curPDFIdx)
{
//取出当前页
pdfPage = (Acrobat.CAcroPDPage)doc.AcquirePage(curPDFIdx - 1);

//得到当前页的大小
pdfPoint = (Acrobat.CAcroPoint)pdfPage.GetSize();
//生成一个页的裁剪区矩形对象
pdfRect = (Acrobat.CAcroRect)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.Rect", "");

int pdfWidth = pdfPoint.x * pdfDPI / 72;//默认PDF的点是72DPI得到的。
int pdfHeight = pdfPoint.y * pdfDPI / 72;

//设置裁剪矩形的大小为当前页的大小
pdfRect.Left = 0;
pdfRect.right = (short)(pdfWidth);
pdfRect.Top = 0;
pdfRect.bottom = (short)(pdfHeight);

//将当前页的裁剪区的内容编成图片后复制到剪贴板中//耗时30多毫秒
pdfPage.CopyToClipboard(pdfRect, 0, 0, (short)(100 * pdfDPI / 72)); //100指100%

try
{
System.Windows.IDataObject clipboardData = System.Windows.Clipboard.GetDataObject();
//检查剪贴板中的对象是否是图片,如果是图片则将其保存为指定格式的图片文件
if (clipboardData.GetDataPresent(System.Windows.DataFormats.Bitmap))
{//InteropBitmap转换成Drawing.bitmap
int stride = ((pdfWidth * 32 + 31) & ~31) >> 3;
byte[] byte_arr = new byte[(int)(pdfHeight * stride)];
InteropBitmap interopBitmap = (InteropBitmap)clipboardData.GetData(System.Windows.DataFormats.Bitmap);
interopBitmap.CopyPixels(byte_arr, stride, 0);
System.Drawing.Imaging.BitmapData bmpData;

//The Width and Height should be static don't bother depending on the InteropBitmap for them
bitmap = new System.Drawing.Bitmap(pdfWidth, pdfHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
bmpData = bitmap.LockBits(new System.Drawing.Rectangle(new System.Drawing.Point(), bitmap.Size), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
System.Runtime.InteropServices.Marshal.Copy(byte_arr, 0, bmpData.Scan0, byte_arr.Length);
bitmap.UnlockBits(bmpData);

bitmap.Save(@"D:\" + curPDFIdx.ToString() + ".bmp");//10毫秒
bitmap.Dispose();
}
}
catch (Exception ex)
{
ShowError(ex.Message, "");
return;
}
Marshal.ReleaseComObject(pdfPage);
Marshal.ReleaseComObject(pdfRect);
Marshal.ReleaseComObject(pdfPoint);
}
Marshal.ReleaseComObject(doc);

...全文
565 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
csczh 2018-12-25
  • 打赏
  • 举报
回复
能热心 帮别人回答问题是好的,
但是请别还没弄清楚之前就带着批判的语气,就算对新手也一样。
如果大家回答问题都要带点批判别人的语气,还骂别人之类的,会打击到人家不是吗。
就算你真的很厉害,我不相信你从始至今犯过小错误。
csczh 2018-12-25
  • 打赏
  • 举报
回复
引用 8 楼 xuzuning 的回复:
你不是想要知道 写入速度变慢 的原因吗?
不反映真实情况,怎么帮你去找?

找不找是一回事,但是别说什么自己对自己不负责之类话。
遇到问题,本来就已经很头疼了,不应该带着不良情绪回答啊。
还有,我说过本来说有作了限制,为什么你非要从这一点上纠结呢?
就算没作限制,2000多的文件怎么会卡呢,对不对?
xuzuning 2018-12-25
  • 打赏
  • 举报
回复
你不是想要知道 写入速度变慢 的原因吗?
不反映真实情况,怎么帮你去找?
csczh 2018-12-25
  • 打赏
  • 举报
回复
引用 5 楼 xuzuning 的回复:
for (curPDFIdx = 0; curPDFIdx < PD.PlateList.Count; ++curPDFIdx)
bitmap.Save(@"D:\" + curPDFIdx.ToString() + ".bmp");//10毫秒
这就是限制???
自己对自己都不负责任!


当然不是,PlateList就是限制。
另外,反映现象就可以了,别带着批判的口吻说话,特别是你不清楚的时候。
xuzuning 2018-12-14
  • 打赏
  • 举报
回复
for (curPDFIdx = 0; curPDFIdx < PD.PlateList.Count; ++curPDFIdx)
bitmap.Save(@"D:\" + curPDFIdx.ToString() + ".bmp");//10毫秒
这就是限制???
自己对自己都不负责任!
csczh 2018-12-14
  • 打赏
  • 举报
回复
引用 2 楼 xuzuning 的回复:
当同一目录下的文件数达到或超过256(512)时,访问速度会变慢,这是不争的事实


单个目录下有做限制,每个文件夹1000张图片,每张图片8M左右。
csczh 2018-12-14
  • 打赏
  • 举报
回复
我单个目录下有做限制 ,第个文件 夹1000个图片,每张图片 8M左右 。
xuzuning 2018-12-14
  • 打赏
  • 举报
回复
当同一目录下的文件数达到或超过256(512)时,访问速度会变慢,这是不争的事实
APP开发王 2018-12-14
  • 打赏
  • 举报
回复
可以用WPF 的保存UI到图片的模式,就不需要调用PDF组件的方法保存图片了,速度应该超快
,类似截图功能。只是可以吧显示的PDF内容页放到UI上然后保存UI的截图。

110,549

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧