iT邦幫忙

0

關於搜尋pdf 裏的文字

  • 分享至 

  • xImage

我司是做貿易相關的

經常會有一堆航空公司的waybill,
想做一個excel marco, 將一個資料夾的account number 分做A公司, 第二個account number 分做B公司

但不知道怎樣搜尋pdf裏的文字

看更多先前的討論...收起先前的討論...
聽不懂
請問是掃描檔?還是列印或轉換成PDF的?
還是傳真存檔?
cyris iT邦新手 5 級 ‧ 2021-02-16 13:29:44 檢舉
@japhenchen 應該是word 檔轉換成pdf 吧, fedex 的 invoice
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
japhenchen
iT邦超人 1 級 ‧ 2021-02-13 16:59:20
最佳解答

如果是傳真掃描檔的話,你可以寫程式(我建議c#或Python)把PDF固定特定要識別區域截圖成單色png檔,丟給tesseract OCR(c#跟Python都有提供) 作文字辨識

說半天也得要你有程式設計的能力,否則就只能尋求付費外包來解決了
(我先舉手)

看更多先前的回應...收起先前的回應...
cyris iT邦新手 5 級 ‧ 2021-02-16 13:33:49 檢舉

我己經把pdf 的檔轉換成.txt 檔案了, 但現在問題是, 要怎樣找尋裏面的文字在貼上excel表格中,例如帳單號碼,重量, 總金額之類的

格式固定嗎?

cyris iT邦新手 5 級 ‧ 2021-02-16 15:33:23 檢舉

格式基本都是固定的, 現在我己將一個txt 的檔案匯入到excel 表格內, 從A1 開始
想從A1 開始, 一直往下搜尋自己想要的字, 例如帳單日期, 然後帳單日期後面的日期想自動寫在另一worksheets B 的A2內, 如此類推, 有多少個帳單日期都是未知數

所以我才表示要把特定區塊截取下來才來分割表格內容,不然你只會得到一個難以切割的TXT,就算你以空白當分割字符,如果有一個品名裡有空白,你就頭大了

cyris iT邦新手 5 級 ‧ 2021-02-16 16:05:13 檢舉
Sub insert_click()
 Dim myRng As Range, allRng As Range, i As Long
    Dim firstAddress As String
    
    Set allRng = Application.Intersect(Range("A:A"), Cells.Parent.UsedRange)
    Set myRng = allRng.Find(what:="invoice date", LookAt:=xlPart)
    If myRng Is Nothing Then Exit Sub
    
    firstAddress = myRng.Address
    i = 1
    
    
    Do
        i = i + 1
        Worksheets("invoice date").Cells(i, "B") = myRng.Value
        Set myRng = allRng.FindNext(myRng)
    Loop Until myRng.Address = firstAddress

    
    


End Sub

我用了這一語法可以把inovice date 找出來, 但我只想找inovice date 後面的日期.....還在研究中

可以提供樣本PDF截圖嗎?

cyris iT邦新手 5 級 ‧ 2021-02-16 17:46:07 檢舉

https://ithelp.ithome.com.tw/upload/images/20210216/20134597XlTDSlFU3K.jpg

現在有遇到這個問題, 如圖所示, A行,的ship date + 日期
怎樣才能從A行的ship date 後擷取後面的日期到B行呢

Richie iT邦新手 5 級 ‧ 2021-02-17 09:30:13 檢舉

用Excel公式 MID 應該就取的到了
=MID(A2,11,LEN(A2))

cyris iT邦新手 5 級 ‧ 2021-02-17 13:09:55 檢舉

先謝謝大大回覆,如果想用VBA自己檢查,要怎麼做呢?因為不是下一行就是同一個ship date, 要隔好多行才有

Sub 巨集1()
'
    LastUsedRow = ActiveSheet.Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlFormulas).Row
    ' 最後一列列號


    For r = 2 To LastUsedRow
        If IsEmpty(Cells(r, 1)) = False Then
            Cells(r, 2).Value = Right(Cells(r, 1).Value,10)
        End If
    Next
End Sub
cyris iT邦新手 5 級 ‧ 2021-02-17 13:53:40 檢舉

感謝大大, 我試試

cyris iT邦新手 5 級 ‧ 2021-02-17 14:17:37 檢舉

to japhenchen 大大
這個我試了, 可以,
用最後的算上去
VBA 就沒有指定一個算法可以檢測如果ship date 後面是日期就擷取嗎?

cyris iT邦新手 5 級 ‧ 2021-02-17 14:22:26 檢舉
Sub Button1_Click()
'
   LastUsedRow = ActiveSheet.Cells.Find(What:="date", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlFormulas).Row


    For r = 2 To LastUsedRow
        If IsEmpty(Cells(r, 1)) = False Then
            Cells(r, 2).Value = Mid(Cells(r, 1).Value, 11, 10)
        End If
    Next
End Sub

我改了中間的寫法, 感謝大大~~~~

你可以用isDate(mid(cells(r,1),11,10)) 來檢測是不是日期的格式
例 02/17/2021 這種就算

Sub Button1_Click()

   LastUsedRow = ActiveSheet.Cells.Find(What:="date", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlFormulas).Row


    For r = 2 To LastUsedRow
        If IsEmpty(Cells(r, 1)) = False Then
            strD =  Mid(Cells(r, 1).Value, 11, 10)
            ' 我還是建議用Right,因為看起來日期都是放在最右邊
            if isDate(strD) Then
                Cells(r, 2).Value = strD 
            end if
        End If
    Next
End Sub

cyris iT邦新手 5 級 ‧ 2021-02-17 15:16:09 檢舉

這個非常好用, 感謝大大~

請問一下, find 這個能否只找尋特定字的付近50文字左右, 很多時候日期後面跟了一大堆沒用的文字, 巨集用起來會很慢

改用正則表達式抓日期值
1、加入Microsoft VBScript RegularExpression 5.5
https://ithelp.ithome.com.tw/upload/images/20210217/20117954r3zeQwdkl4.jpg
https://ithelp.ithome.com.tw/upload/images/20210217/20117954Tawz57Yp3L.jpg

程式改寫如下

Sub 巨集1()
'
    Dim regEx As New RegExp
    LastUsedRow = ActiveSheet.Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookIn:=xlFormulas).Row
    ' 最後一列列號

    regEx.Pattern = "(\d{1,2}/\d{1,2}/\d{4})"
    regEx.Global = False
    regEx.IgnoreCase = False
    regEx.MultiLine = False
    
    
    For r = 2 To LastUsedRow
        If IsEmpty(Cells(r, 1)) = False Then
            Data = Cells(r, 1).Value
            Set m = regEx.Execute(Data)
            If m.Count > 0 Then
                Cells(r, 2).Value = m(0)
            End If
        End If
    Next
    
End Sub

完美..
https://ithelp.ithome.com.tw/upload/images/20210217/20117954KqcLlNdqmb.jpg

cyris iT邦新手 5 級 ‧ 2021-02-17 16:38:15 檢舉

WOW, 神乎其技, 感謝~

/images/emoticon/emoticon02.gif
給個分數咩~

cyris iT邦新手 5 級 ‧ 2021-02-17 18:32:26 檢舉

100分

0
海綿寶寶
iT邦大神 1 級 ‧ 2021-02-10 21:16:53
cyris iT邦新手 5 級 ‧ 2021-02-11 15:39:37 檢舉

謝謝海綿大大, 不過這個沒太多作用, 只是pdf 的字而己, 不過也謝謝

0
PPTaiwan
iT邦好手 1 級 ‧ 2021-02-11 15:51:48

但不知道怎樣搜尋pdf裏的文字

回答上面,必須透過轉檔將裡面的文字轉出來,這是最快的方式

cyris iT邦新手 5 級 ‧ 2021-02-17 18:32:48 檢舉

是成功了, 謝謝

0
淺水員
iT邦大師 6 級 ‧ 2021-02-12 00:24:25

PDF 不見得 100% 都能直接轉換成文字

這邊給個範例檔
這檔案內的文字的確是文字(並非內嵌圖片的 pdf)
能正常顯示及列印文字
也可以複製(不過貼上時會變成亂碼)

像是這種 PDF 可能就得靠 OCR 的方式來判斷文字了

雖然說這種檔案應該很少見
不過系統的規劃上可能要考慮一下有這種情形發生

cyris iT邦新手 5 級 ‧ 2021-02-17 18:33:36 檢舉

怎樣可以用vba以ocr 方式轉為文字?

淺水員 iT邦大師 6 級 ‧ 2021-02-17 21:12:06 檢舉

ocr其實我也沒用過,只知道那是圖像辨識為文字的技術
我提出這個檔案主要是想說作業流程上可能要加一個「無法自動分類的部分要丟給人工辨識」
(辨識能力:人類 > 轉文字或OCR)

cyris iT邦新手 5 級 ‧ 2021-02-18 13:12:39 檢舉

確實, 我在轉換文字的時候是有一點不能轉換的
但還好這次影響不大

我要發表回答

立即登入回答