当前位置: 首页 > 知识库问答 >
问题:

从PDF中提取数据并添加到工作表

微生俊捷
2023-03-14

我正在尝试将PDF文档中的数据提取到工作表中。PDF显示和文本可以手动复制并粘贴到Excel文档中。

我目前正在通过SendKeys执行此操作,但它不起作用。当我尝试从PDF文档中粘贴数据时,我会出错。为什么我的粘贴不起作用?如果我在宏停止运行后粘贴,它会正常粘贴。

Dim myPath As String, myExt As String
Dim ws As Worksheet
Dim openPDF As Object
'Dim pasteData As MSForms.DataObject
Dim fCell As Range

'Set pasteData = New MSForms.DataObject
Set ws = Sheets("DATA")
If ws.Cells(ws.Rows.Count, "A").End(xlUp).Row > 1 Then Range("A3:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row).ClearContents

myExt = "\*.pdf"
'When Scan Receipts Button Pressed Scan the selected folder/s for receipts
For Each fCell In Range(ws.Cells(1, 1), ws.Cells(1, ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column))
    myPath = Dir(fCell.Value & myExt)
    Do While myPath <> ""
        myPath = fCell.Value & "\" & myPath
        Set openPDF = CreateObject("Shell.Application")
        openPDF.Open (myPath)
        Application.Wait Now + TimeValue("00:00:2")
        SendKeys "^a"
        Application.Wait Now + TimeValue("00:00:2")
        SendKeys "^c"
        'Application.Wait Now + TimeValue("00:00:2")
        ws.Select
        ActiveSheet.Paste
        'pasteData.GetFromClipboard

        'ws.Cells(3, 1) = pasteData.GetText
        Exit Sub

        myPath = Dir
    Loop

Next fCell

共有3个答案

刘星火
2023-03-14

随着时间的推移,我发现以结构化格式从PDF中提取文本是一项艰巨的工作。但是,如果您正在寻找一种简单的解决方案,您可能需要考虑XPDF工具pdftotext

提取文本的伪代码将包括:

  1. 使用VBA语句,使用XPDF将文本从PDF提取到临时文件

简化示例如下:

    Sub ReadIntoExcel(PDFName As String)
        'Convert PDF to text
        Shell "C:\Utils\pdftotext.exe -layout " & PDFName & " tempfile.txt"

        'Read in the text file and write to Excel
        Dim TextLine as String
        Dim RowNumber as Integer
        Dim F1 as Integer
        RowNumber = 1
        F1 = Freefile()
        Open "tempfile.txt" for Input as #F1
            While Not EOF(#F1)
                Line Input #F1, TextLine
                ThisWorkbook.WorkSheets(1).Cells(RowNumber, 1).Value = TextLine
                RowNumber = RowNumber + 1
            Wend
        Close #F1
    End Sub
计向晨
2023-03-14

我知道这是一个老问题,但我只是不得不为工作中的一个项目这样做,我很惊讶还没有人想到这个解决方案:只需使用Microsoft word打开. pdf。

当您尝试从. docx中提取数据时,该代码更容易使用,因为它在Microsoft Word中打开。Excel和Word很好地结合在一起,因为它们都是Microsoft程序。在我的例子中,有问题的文件必须是. pdf文件。这是我想出的解决方案:

  1. 选择要打开的默认程序。pdf文件为Microsoft Word

是的,你可以转换。pdf文件。但在我看来,这是一个更简单的解决方案

赖俊
2023-03-14

您可以使用Adobe库打开PDF文件并提取其内容(我相信您可以从Adobe下载作为SDK的一部分,但它也附带了某些版本的Acrobat)

确保也将库添加到引用中(在我的机器上是Adobe Acrobat 10.0类型库,但不确定这是否是最新版本)

即使使用Adobe library,它也不是微不足道的(您需要添加自己的错误捕获等):

Function getTextFromPDF(ByVal strFilename As String) As String
   Dim objAVDoc As New AcroAVDoc
   Dim objPDDoc As New AcroPDDoc
   Dim objPage As AcroPDPage
   Dim objSelection As AcroPDTextSelect
   Dim objHighlight As AcroHiliteList
   Dim pageNum As Long
   Dim strText As String

   strText = ""
   If (objAvDoc.Open(strFilename, "") Then
      Set objPDDoc = objAVDoc.GetPDDoc
      For pageNum = 0 To objPDDoc.GetNumPages() - 1
         Set objPage = objPDDoc.AcquirePage(pageNum)
         Set objHighlight = New AcroHiliteList
         objHighlight.Add 0, 10000 ' Adjust this up if it's not getting all the text on the page
         Set objSelection = objPage.CreatePageHilite(objHighlight)

         If Not objSelection Is Nothing Then
            For tCount = 0 To objSelection.GetNumText - 1
               strText = strText & objSelection.GetText(tCount)
            Next tCount
         End If
      Next pageNum
      objAVDoc.Close 1
   End If

   getTextFromPDF = strText

End Function

这与您尝试做的基本相同——只使用Adobe自己的库。它一次浏览一页PDF,突出显示页面上的所有文本,然后将其(一次一个文本元素)放入字符串中。

请记住,从中得到的可能会充满各种非打印字符(换行符、换行符等),它们甚至可能会出现在看起来像连续文本块的中间,因此在使用它之前,您可能需要额外的代码来清理它。

希望这有帮助!

 类似资料:
  • 在python代码中,如何有效地将pdf中的某个页面保存为jpeg文件?(用例:我有一个python烧瓶Web服务器,其中pdf-s将被上传,每个页面对应的jpeg-s是存储的。) 这个解决方案很接近,但问题是它无法将整个页面转换为jpeg。

  • 我正在使用PDFBox从我的pdf(只包含JPG的)中提取图像。 因为我将把这些图像保存在我的数据库中,所以我想先把每个图像直接转换成一个inputstream对象,而不把文件临时放在我的文件系统上。然而,我在这方面遇到了困难。我认为这是因为使用了,就像我在下面的示例中所做的那样: 然而,这是可行的: 知道我如何将每个PDXObjectImage(或我能得到的任何其他对象)转换为InputStre

  • 我有关于从PDF文件中提取数据的查询。我有一个PDF文件,其中包含多个可用的数据表。我想从需要的表内容中提取数据。 如何从 PDF 文件中提取表格数据? 如何使用 iText/PDFBox 执行此操作?

  • 我试图从包含列表的json中提取一个字段,然后将该列表附加到数据帧中,但遇到了一些不同的错误。 我想我可以将其写入csv,然后用Pandas读取csv,但我尽量避免写入任何文件。我知道我也可以使用StringIO生成csv,但这存在空字节问题。替换这些将是(我认为)另一个逐行的步骤,这将进一步延长脚本完成所需的时间。。。我正在对一个返回成千上万个结果的查询运行此操作,因此保持它的快速和简单是一个优

  • 我想知道如何从pdf中提取数据,通过使用python语言在py魅力。我试图通过从pypdf2导入使用py魅力编码,但它没有显示结果。

  • 问题内容: 我正在寻找一种在Linux Shell环境中从HTML获取某些信息的方法。 这是我感兴趣的一点: 我想将它们存储在shell变量中或在从html上面提取的键值对中回显这些变量。范例: 目前,我可以做的是创建一个Java程序,该程序将使用sax解析器或html解析器(例如jsoup)来提取此信息。 但是在这里使用Java似乎很麻烦,因为要在您要执行的“包装器”脚本中包含可运行的jar。