如果是傳真掃描檔的話,你可以寫程式(我建議c#或Python)把PDF固定特定要識別區域截圖成單色png檔,丟給tesseract OCR(c#跟Python都有提供) 作文字辨識
說半天也得要你有程式設計的能力,否則就只能尋求付費外包來解決了
(我先舉手)
我己經把pdf 的檔轉換成.txt 檔案了, 但現在問題是, 要怎樣找尋裏面的文字在貼上excel表格中,例如帳單號碼,重量, 總金額之類的
格式固定嗎?
格式基本都是固定的, 現在我己將一個txt 的檔案匯入到excel 表格內, 從A1 開始
想從A1 開始, 一直往下搜尋自己想要的字, 例如帳單日期, 然後帳單日期後面的日期想自動寫在另一worksheets B 的A2內, 如此類推, 有多少個帳單日期都是未知數
所以我才表示要把特定區塊截取下來才來分割表格內容,不然你只會得到一個難以切割的TXT,就算你以空白當分割字符,如果有一個品名裡有空白,你就頭大了
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截圖嗎?
現在有遇到這個問題, 如圖所示, A行,的ship date + 日期
怎樣才能從A行的ship date 後擷取後面的日期到B行呢
用Excel公式 MID 應該就取的到了
=MID(A2,11,LEN(A2))
先謝謝大大回覆,如果想用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
感謝大大, 我試試
to japhenchen 大大
這個我試了, 可以,
用最後的算上去
VBA 就沒有指定一個算法可以檢測如果ship date 後面是日期就擷取嗎?
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
這個非常好用, 感謝大大~
請問一下, find 這個能否只找尋特定字的付近50文字左右, 很多時候日期後面跟了一大堆沒用的文字, 巨集用起來會很慢
改用正則表達式抓日期值
1、加入Microsoft VBScript RegularExpression 5.5
程式改寫如下
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
完美..
參考看看
用 VBA 在 pdf 裡找文字
但不知道怎樣搜尋pdf裏的文字
回答上面,必須透過轉檔將裡面的文字轉出來,這是最快的方式
PDF 不見得 100% 都能直接轉換成文字
這邊給個範例檔
這檔案內的文字的確是文字(並非內嵌圖片的 pdf)
能正常顯示及列印文字
也可以複製(不過貼上時會變成亂碼)
像是這種 PDF 可能就得靠 OCR 的方式來判斷文字了
雖然說這種檔案應該很少見
不過系統的規劃上可能要考慮一下有這種情形發生