Foxtable(狐表)用户栏目专家坐堂 → [求助]net4.0下PDF转图片


  共有2743人关注过本帖树形打印复制链接

主题:[求助]net4.0下PDF转图片

帅哥哟,离线,有人找我吗?
天一生水
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1141 积分:11272 威望:0 精华:0 注册:2017/9/26 16:30:00
[求助]net4.0下PDF转图片  发帖心情 Post By:2019/10/24 16:59:00 [只看该作者]

蓝老师好!

你提供的PDF转图片示例:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=90692&skin=0

在.net4.0下运行提示如下,应该是PDFLibNet.dll不支持的原因,不知道老师有没有解决的方案?

谢谢! 

 


图片点击可在新窗口打开查看此主题相关图片如下:截屏图片 (1).jpg
图片点击可在新窗口打开查看
[此贴子已经被作者于2019/10/24 17:00:18编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110333 积分:561507 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/10/24 17:10:00 [只看该作者]


 回到顶部
帅哥哟,离线,有人找我吗?
天一生水
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1141 积分:11272 威望:0 精华:0 注册:2017/9/26 16:30:00
  发帖心情 Post By:2019/10/24 21:00:00 [只看该作者]

谢谢老师!
确实简单好用,特别是可以设置dpi的值。
但是怎样获取PDF的总页数,便于循环导出每一页的图片呢?

For i As Integer = 0 To 5
    Dim pdfFile = O2S.Components.PDFRender4NET.PDFFile.Open("c:\AAA.pdf") '红色为文件路径
    Dim pageImage As Image = pdfFile.GetPageImage(i,100) '第一个参数1为页数,从0开始,1表示第二页;第二个参数为图片清晰度,数值越大越清晰,同时保存的图片文件也就越大
    pageImage.Save("C:\test\" & i & ".jpg")
    pageImage.Dispose() '释放内存资源
    pdfFile.Dispose() '释放内存资源
Next

[此贴子已经被作者于2019/10/24 21:26:07编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110333 积分:561507 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/10/25 10:18:00 [只看该作者]


Dim pdfFile = O2S.Components.PDFRender4NET.PDFFile.Open("c:\AAA.pdf") '红色为文件路径
For i As Integer = 0 To pdfFile.pagecount - 1
    Dim pageImage As Image = pdfFile.GetPageImage(i,100) '第一个参数1为页数,从0开始,1表示第二页;第二个参数为图片清晰度,数值越大越清晰,同时保存的图片文件也就越大
    pageImage.Save("C:\test\" & i & ".jpg")
    pageImage.Dispose() '释放内存资源
Next
pdfFile.Dispose() '释放内存资源

 回到顶部
帅哥哟,离线,有人找我吗?
天一生水
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1141 积分:11272 威望:0 精华:0 注册:2017/9/26 16:30:00
  发帖心情 Post By:2019/10/26 11:45:00 [只看该作者]

谢谢蓝老师!
遇到一个新问题,当PDF页数较多时,比如500页,这时,拆分到100页以后就非常慢,基本上一秒一页,代码里面的释放内存的代码好像没起到作用。
能否100页,100页的拆分,代码应该怎样写?请老师指教!
谢谢!

Dim pdfFile = O2S.Components.PDFRender4NET.PDFFile.Open("c:\AAA.pdf") '红色为文件路径
For i As Integer = 0 To pdfFile.pagecount - 1
  If i Mod 100 = 0 Then
    Dim pageImage As Image = pdfFile.GetPageImage(i,100) '第一个参数1为页数,从0开始,1表示第二页;第二个参数为图片清晰度,数值越大越清晰,同时保存的图片文件也就越大
    pageImage.Save("C:\test\" & i & ".jpg")
    pageImage.Dispose() '释放内存资源
  end if
Next
pdfFile.Dispose() '释放内存资源



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110333 积分:561507 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/10/26 11:56:00 [只看该作者]

未必有用,可以试试

Dim pdfFile = O2S.Components.PDFRender4NET.PDFFile.Open("c:\AAA.pdf") 
dim cnt as integer = pdfFile.pagecount
pdfFile.Dispose()

dim cc as integer = math.Ceiling(cnt / 100)
Dim pageImage As Image
for i as integer = 0 to cc - 1
pdfFile = O2S.Components.PDFRender4NET.PDFFile.Open("c:\AAA.pdf") 
for each j as integer = i*100 to math.min(cnt - 1,( i + 1) * 100 1)
pageImage = pdfFile.GetPageImage(j,100) '第一个参数1为页数,从0开始,1表示第二页;第二个参数为图片清晰度,数值越大越清晰,同时保存的图片文件也就越大
    pageImage.Save("C:\test\" & j & ".jpg")
next
pdfFile.Dispose() 
next

 回到顶部
帅哥哟,离线,有人找我吗?
天一生水
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1141 积分:11272 威望:0 精华:0 注册:2017/9/26 16:30:00
  发帖心情 Post By:2019/10/26 13:01:00 [只看该作者]

for以后的代码注释,2个msgbox会弹出,并且正确。
全部运行代码,就直接弹出如下窗口,msgbox也不提示了。没找到原因,请老师看一下。
谢谢!


图片点击可在新窗口打开查看此主题相关图片如下:截屏图片 (7).jpg
图片点击可在新窗口打开查看



 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110333 积分:561507 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/10/26 13:48:00 [只看该作者]

for j as integer = i*100 to math.min(cnt - 1,( i + 1) * 100 1)

 回到顶部
帅哥哟,离线,有人找我吗?
天一生水
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1141 积分:11272 威望:0 精华:0 注册:2017/9/26 16:30:00
  发帖心情 Post By:2019/10/26 19:44:00 [只看该作者]

谢谢老师!
正如老师所说“未必有用”,202页PDF拆分图片,使用分段前34.9秒,按每100页分段拆分34.5秒,按照30或50分段拆分,反而会更慢。

我整体代码变慢的原因是因为把拆分的图片信息写入了数据表,然后数据表每获取到一张图片就再推送到ListViewRow显示。
数据表推送图片的代码 DataRowAdded 如下,这段代码使整段代码的运行从34秒提高到了106秒。
是不是下面的代码在新增一张图片时,又刷新了一遍所有的图片造成的?
这种推送图片的效果怎样写才会更快一些?

    If Forms("窗口2").opened Then
        Dim lvw As WinForm.ListView = Forms("窗口2").Controls("ListView1")
        'lvw.CheckBoxes = True
        lvw.AllowDrag = True '允许拖动行
        lvw.AllowDrop = True '允许接收拖动过来的行
        
        lvw.StopRedraw() '暂停绘制
        lvw.Rows.Clear() '清除原来的行
        lvw.Images.Clear() '清除原来的图片
        lvw.View = ViewMode.LargeIcon '显示模式为 大图标
        lvw.Images.LargeSize = New Size(70,99) '定义大图标尺寸
        For Each dr As DataRow In DataTables("图片列表").DataRows '从数据表中提取数据
            Dim Key As String = dr("全路径")     '获取照片文件
            lvw.Images.AddLargeImage(Key, Key)   '添加照片,直接用文件名作为图片键值
            Dim vr As  WinForm.ListViewRow =  lvw.Rows.Add()   '增加一行
            vr.Text = dr("文件名")    '设置标题
            vr.ImageKey = Key    '设置图片键值
        Next
        lvw.ResumeRedraw() '恢复绘制
    End If

[此贴子已经被作者于2019/10/27 7:51:43编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点蓝
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:110333 积分:561507 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2019/10/27 20:07:00 [只看该作者]

是的,新增一张图片时,又刷新了一遍所有的图片。这种代码本来就不适合放到DataRowAdded事件,放到窗口按钮还差不多,或者放到7楼的代码之后

 回到顶部