Foxtable(狐表)用户栏目专家坐堂 → [求助]PDF分解为图片


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

主题:[求助]PDF分解为图片

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


加好友 发短信
等级:五尾狐 帖子:1141 积分:11272 威望:0 精华:0 注册:2017/9/26 16:30:00
[求助]PDF分解为图片  发帖心情 Post By:2018/4/19 11:26:00 [只看该作者]

问题:

1、360页的PDF文件分解为图片,进行到一半时卡住,提示存储不足;另外,分解一张图片接近1秒。

2、第二行的 '切换页签  代码,每次好像来不及运行似的,要等到所有代码运行完毕后才能切换。
请老师帮助看一下,如何解决上述问题。

谢谢!


'以下分解PDF为图片
If e.Form.Controls("TextBox1").text <> "" Then      'PDF文件已获取
    Forms("识别").Controls("TabControl1").SelectedPage = Forms("识别").Controls("TabControl1").TabPages("图片列表")    '切换页签
    Dim st As Date = Date.Now   '开始计时
    e.Form.BaseForm.WindowState =  System.Windows.Forms.FormWindowState.Maximized     '窗口最大化保证图片分辨率
    Dim Pdfv As new PDFView.ConvertPDF.PDFConvert
    Dim pcb As WinForm.PictureBox = e.form.Controls("图片")
    Dim path1 As String = e.Form.Controls("TextBox1").text                            '获取的PDF文件路径
    Dim finfo As new FileInfo(path1)
    For i As Integer = 1 To _pdfWrapper.PageCount                                     '遍历PDF的页数
        pcb.Image = _pdfWrapper.Pages(i).GetBitmap(pcb.Width, pcb.Height,True)        '获取每页图片
        Dim path As String = ProjectPath & "Attachments\" & "PDF" & finfo.Name.substring(0,finfo.Name.LastIndexOf(".")) & "-" & i & ".jpg"      '为每页图片命名并存储
        pcb.Image.Save(path)
        pcb.ImageFile = path
        Dim inf As new FileInfo(path)
        Dim ndr As DataRow = DataTables("图片列表").addnew                             '将图片信息写入表(通过表事件显示在ListView1)
        ndr("全路径") = path
        ndr("文件名") = inf.Name
        ndr("时间") = Date.Now       
    Next
    msgbox("已获取" & _pdfWrapper.PageCount & "张图片" & vbcrlf & "耗时: " & (Date.Now - st).TotalSeconds & "秒")
Else
    Return
End If

[此贴子已经被作者于2021/7/10 7:44:50编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/4/19 11:41:00 [只看该作者]

1、

 

100页、100页这样获取图片。获取完100页以后,把_pdfWrapper注释掉dispose,重新打开pdf,再获取100页。

 

2、加上 doEvents 的代码

 

http://www.foxtable.com/webhelp/scr/1476.htm

 


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


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

谢谢甜老师!

第二个问题彻底解决了;第一个问题怎样循环、注释请指教,谢谢!

 

If e.Form.Controls("TextBox1").text <> "" Then      'PDF文件已获取
    e.Form.BaseForm.WindowState =  System.Windows.Forms.FormWindowState.Maximized     '窗口最大化保证图片分辨率
    Forms("文字识别").Controls("TabControl1").SelectedPage = Forms("文字识别").Controls("TabControl1").TabPages("图片列表")    '切换页签
    Application.DoEvents()

    Dim st As Date = Date.Now   '开始计时

 

    Dim prs As Integer = 100
    For p As Integer = 1 To math.Ceiling((_pdfWrapper.PageCount) / prs)

    Dim Pdfv As new PDFView.ConvertPDF.PDFConvert
    Dim pcb As WinForm.PictureBox = e.form.Controls("图片")
    Dim path1 As String = e.Form.Controls("TextBox1").text                            '获取的PDF文件路径
    Dim finfo As new FileInfo(path1)

 

    For i As Integer = p * prs To math.min(_pdfWrapper.PageCount, p * prs)
    'For i As Integer = 1 To _pdfWrapper.PageCount                                     '遍历PDF的页数
        pcb.Image = _pdfWrapper.Pages(i).GetBitmap(pcb.Width, pcb.Height,True)        '获取每页图片
        Dim path As String = ProjectPath & "Attachments\" & "PDF" & finfo.Name.substring(0,finfo.Name.LastIndexOf(".")) & "-" & i & ".jpg"      '为每页图片命名并存储


        _pdfWrapper.Dispose    ‘???


        pcb.Image.Save(path)
        pcb.ImageFile = path
        Dim inf As new FileInfo(path)
        Dim ndr As DataRow = DataTables("图片列表").addnew                             '将图片信息写入表(通过表事件显示在ListView1)
        ndr("全路径") = path
        ndr("文件名") = inf.Name
        ndr("时间") = Date.Now       
    Next
    Next
    msgbox("已获取" & _pdfWrapper.PageCount & "张图片" & vbcrlf & "耗时: " & (Date.Now - st).TotalSeconds & "秒")
Else
    Return
End If

[此贴子已经被作者于2018/4/19 12:55:25编辑过]

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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/4/19 13:05:00 [只看该作者]

For i As Integer = 1 To _pdfWrapper.PageCount                                     '遍历PDF的页数
    If i Mod 100 = 0 Then
        _pdfWrapper.dispose

        _pdfWrapper = Nothing

        gc.collect
        _pdfWrapper = 重新打开某个pdf文件
    End If

    pcb.Image = _pdfWrapper.Pages(i).GetBitmap(pcb.Width, pcb.Height,True)        '获取每页图片
Next

[此贴子已经被作者于2018/4/19 13:05:38编辑过]

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


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

我以10页为一组,当运行完第9页时,弹出未将项目指定实例。请老师看看是哪里问题?

谢谢!

 

If e.Form.Controls("TextBox1").text <> "" Then      'PDF文件已获取
    e.Form.BaseForm.WindowState =  System.Windows.Forms.FormWindowState.Maximized     '窗口最大化保证图片分辨率
    Forms("文字识别").Controls("TabControl1").SelectedPage = Forms("文字识别").Controls("TabControl1").TabPages("图片列表")
    Application.DoEvents()
    Dim st As Date = Date.Now   '开始计时
    Dim Pdfv As new PDFView.ConvertPDF.PDFConvert
    Dim pcb As WinForm.PictureBox = e.form.Controls("照片")
    Dim path1 As String = e.Form.Controls("TextBox1").text                            '获取的PDF文件路径
    Dim finfo As new FileInfo(path1)
    For i As Integer = 1 To _pdfWrapper.PageCount                                     '遍历PDF的页数
       
        If i Mod 10 = 0 Then
            _pdfWrapper.dispose
            _pdfWrapper = Nothing
            gc.collect
            _pdfWrapper.LoadPDF(path1)
        End If
       
        pcb.Image = _pdfWrapper.Pages(i).GetBitmap(pcb.Width, pcb.Height,True)        '获取每页图片
        Dim path As String = ProjectPath & "Attachments\" & "PDF" & finfo.Name.substring(0,finfo.Name.LastIndexOf(".")) & "-" & i & ".jpg"      '为每页图片命名并存储
        pcb.Image.Save(path)
        pcb.ImageFile = path
        Dim inf As new FileInfo(path)
        Dim ndr As DataRow = DataTables("图片列表").addnew                             '将图片信息写入表(通过表事件写入ListView1)
        ndr("全路径") = path
        ndr("文件名") = inf.Name
        ndr("时间") = Date.Now
    Next
    msgbox("已获取" & _pdfWrapper.PageCount & "张图片" & vbcrlf & "耗时: " & (Date.Now - st).TotalSeconds & "秒")
Else
    Return
End If


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/4/19 14:41:00 [只看该作者]

改成

 

For i As Integer = 1 To _pdfWrapper.PageCount                                     '遍历PDF的页数   
    If i Mod 10 = 0 Then
        _pdfWrapper.dispose
        _pdfWrapper = Nothing
        gc.collect
        _pdfWrapper.LoadPDF(path1)
    End If
    do until _pdfWrapper isnot nothing
        Application.DoEvents
    loop


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


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

还是一样,我上传一个实例,请老师帮忙看一下。

实例中的红色代码我先注释掉了,请老师先运行一下旧代码。

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:pdf转图片1.rar


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/4/19 16:38:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:pdf转图片.table


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


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

甜老师,当生成的图片较大时,也会卡住,针对这句加黑代码有无调整方法?

谢谢!

 

If e.Form.Controls("TextBox1").text <> "" Then      'PDF文件已获取
    'e.Form.BaseForm.WindowState =  System.Windows.Forms.FormWindowState.Maximized     '窗口最大化保证图片分辨率
    Forms("文字识别").Controls("TabControl1").SelectedPage = Forms("文字识别").Controls("TabControl1").TabPages("图片列表")
    Application.DoEvents()
    Dim st As Date = Date.Now   '开始计时
    Dim Pdfv As new PDFView.ConvertPDF.PDFConvert
    Dim pcb As WinForm.PictureBox = e.form.Controls("照片")
    Dim path1 As String = e.Form.Controls("TextBox1").text                            '获取的PDF文件路径
    Dim finfo As new FileInfo(path1)
    For i As Integer = 1 To _pdfWrapper.PageCount                                     '遍历PDF的页数
       
        If i Mod 10 = 0 Then
            _pdfWrapper.dispose
            _pdfWrapper = Nothing
            gc.collect
            _pdfWrapper = new PDFLibNet.PDFWrapper()
            _pdfWrapper.LoadPDF(path1)
        End If
       
        'Dim img = _pdfWrapper.Pages(i).GetBitmap(pcb.Width, pcb.Height,True)        '获取每页图片-尺寸同控件


        Dim img = _pdfWrapper.Pages(i).GetBitmap(700, 990,True)        '改为直接设定图片尺寸,生成150张左右会卡住


        Dim path As String = ProjectPath & "Attachments\" & "PDF" & finfo.Name.substring(0,finfo.Name.LastIndexOf(".")) & "-" & i & ".jpg"      '为每页图片命名并存储
        img.Save(path)
        Dim inf As new FileInfo(path)
        Dim ndr As DataRow = DataTables("图片列表").addnew                             '将图片信息写入表(通过表事件写入ListView1)
        ndr("全路径") = path
        ndr("文件名") = inf.Name
        ndr("时间") = Date.Now
    Next
    msgbox("已获取" & _pdfWrapper.PageCount & "张图片" & vbcrlf & "耗时: " & (Date.Now - st).TotalSeconds & "秒")
Else
    Return
End If


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


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/4/20 16:54:00 [只看该作者]

请在8楼的例子上测试。如果有问题,请把pdf和项目发上来测试。

 回到顶部
总数 12 1 2 下一页