Đọc tập tin pdf và đưa vào Excel

Liên hệ QC

levanduyet

Hãy để gió cuốn đi.
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,798
Được thích
4,704
Giới tính
Nam
Có nhiều cách đọc tập tin pdf, ở đây tôi xin giới thiệu cách đọc tập tin pdf sử dụng công cụ xpdfreader.
http://www.xpdfreader.com/download.html
Trong ví dụ sau tôi sử dụng pdftotext (tức là chuyển pdf sang tập tin text) và sau đó sẽ đưa vào Excel.
1, Đầu tiên các bạn theo link trên tải về, giải nén và copy tập tin pdftotext.exe vào thư mục có chứa tập tin pdf muốn đọc.
2, Thay đổi các thông số ở sheet Setting trong tập tin Excel tôi upload lên cho phù hợp với yêu cầu của mình.
3, Thử chạy bằng việc nhấn vào nút Lấy dữ liệu cũng trong sheet Setting. Kết quả sẽ đưa vào sheet Result.

Code sau:
Rich (BB code):
'---------------------------------------------------------------------------------------
' Method : MoFilePdf
' Author : Doit
' Date   : 07/04/2019
' Purpose: Nham doc file pdf va dua vao Excel
'
'          Tai pdftotext tai http://www.xpdfreader.com/download.html
'          Tham khao tai lieu tai http://www.xpdfreader.com/pdftotext-man.html
'---------------------------------------------------------------------------------------
Sub MoFilePdf()

    Dim sFolderPath As String, sBatFileName As String, sPdfFileName As String, sTxtFileNamePath As String
    Dim sPdfExeFolder As String, sTxtFileName As String, FileNumber As Integer, sData As String
    Dim lRow As Long
    Dim PID As Variant
    Dim wsSetting As Worksheet, wsResult As Worksheet

    On Error GoTo MoFilePdf_Error

    ' Nham tang toc do thuc hien
    Application.EnableEvents = False    'Disable Excel Events
    Application.ScreenUpdating = False    'Turn Off Screen Updating to eliminate Screen Flicker and to improve speed performance

    ' Lay ten cac tap tin
    '=====================
    Set wsSetting = ThisWorkbook.Worksheets("Setting")
    Set wsResult = ThisWorkbook.Worksheets("Result")
    sFolderPath = wsSetting.Range("E2")
    sPdfFileName = wsSetting.Range("E3")
    sBatFileName = wsSetting.Range("E4")
    sTxtFileName = wsSetting.Range("E5")
    sTxtFileNamePath = sFolderPath & "\" & sTxtFileName
    sPdfExeFolder = wsSetting.Range("E6")

    ' Tao tap tin bat
    '=================
    FileNumber = FreeFile
    Open sBatFileName For Output As #FileNumber
    ' Chuyen ve thu muc tap tin pdftotext.exe
    Print #FileNumber, "cd " & sPdfExeFolder
    ' Lenh ke tiep cho chay chuong trinh pdftotext.exe voi cac tham so thiet lap truoc
    ' Chu y: su dung Chr(34) cho dau ngoac kep
    Print #FileNumber, "pdftotext.exe -layout " & Chr(34) & sPdfFileName & Chr(34) & " " & Chr(34) & sTxtFileName & Chr(34)
    ' Lenh ke tiep la thoat
    Print #FileNumber, "exit"
    Close #FileNumber

    ' Thuc thi batFile
    ' ================
    PID = Shell(sBatFileName, vbNormalFocus)
    If Err.Number <> 0 Then
        ' Neu co loi thi di den bay loi va thong bao
        GoTo MoFilePdf_Error
    End If
    ' Tiep tuc dua du lieu ra sheet Result
    ' =====================================
    FileNumber = FreeFile
    ' Hang dau de xuat du lieu
    lRow = 1
    wsResult.Cells.Clear    ' Xoa du lieu truoc khi xuat ra
    Open sTxtFileNamePath For Input As FileNumber
    Do While Not EOF(FileNumber)
        Line Input #FileNumber, sData
        wsResult.Cells(lRow, 1) = sData
        lRow = lRow + 1
    Loop
    Close #FileNumber

    ' Neu thanh cong thi thong bao
    MsgBox "Ban da lay du lieu tu tap tin pdf thanh cong.", vbOKOnly, "Thong bao"

MoFilePdf_Exit:
    ' Giai phong bien/release memory
    Set wsSetting = Nothing
    Set wsResult = Nothing

    ' Tra lai tinh trang ban dau
    Application.EnableEvents = True    'Enable Excel Events
    Application.ScreenUpdating = True    'Enable Screen Updating
    Exit Sub

MoFilePdf_Error:
    ' vbCrLf la ky tu xuong dong
    MsgBox "Loi " & Err.Number & " (" & Err.Description & ")." & vbCrLf & "Vui long kiem tra lai.", vbOKOnly + vbInformation, "Thong bao"

End Sub

Trong code ở trên tôi có giải thích.

Hy vọng đây cũng là một ví dụ tham khảo giúp ích cho các bạn.

Lê Văn Duyệt
 

File đính kèm

  • ReadPdfFile.xlsm
    32.1 KB · Đọc: 206
Em thử mãi mà chỉ ra file trắng tinh, anh chạy thử giúp em file pdf này xem thế nào nhé. Xin cảm ơn anh.
Em chào anh Tuấn,
File PDF của anh em thấy đó là file scan anh ạ, cái này thì code chịu thôi anh.
Với những file này nếu là tiếng anh thì còn có thể dùng phần mềm đọc "OCR" (Nhận dạng ký tự quang học) để lấy dữ liệu nếu cần, còn với tiếng việt ta hiện nay thì chắc là đang bó chân toàn tập anh ạ.
 
Upvote 0
Em chào anh Tuấn,
File PDF của anh em thấy đó là file scan anh ạ, cái này thì code chịu thôi anh.
Với những file này nếu là tiếng anh thì còn có thể dùng phần mềm đọc "OCR" (Nhận dạng ký tự quang học) để lấy dữ liệu nếu cần, còn với tiếng việt ta hiện nay thì chắc là đang bó chân toàn tập anh ạ.
Thảo nào mình chạy mãi không được, chân thành cảm ơn bạn nhé.
 
Upvote 0
Em thử mãi mà chỉ ra file trắng tinh, anh chạy thử giúp em file pdf này xem thế nào nhé. Xin cảm ơn anh.
Nó tạo ra file text cùng đường dẫn với file nguồn mà bạn. Muốn chép lên sheet thì dùng thêm 1 hàm nữa.

P/S: À không đọc kỹ, chừ thấy mấy bạn trả lời rồi :)
 
Lần chỉnh sửa cuối:
Upvote 0
Nó tạo ra file text cùng đường dẫn với file nguồn mà bạn. Muốn chép lên sheet thì dùng thêm 1 hàm nữa.
Em thử rồi, nó cũng tạo ra file text, nhưng bên trong file vẫn trắng tinh, không thể hiện bất kỳ một ký tự nào cả nên em nhờ anh chạy thử xem có phải tại em chạy chưa đúng hay do vấn đề gì đó mà em chưa biết anh ạ.
 
Upvote 0
Em thử rồi, nó cũng tạo ra file text, nhưng bên trong file vẫn trắng tinh, không thể hiện bất kỳ một ký tự nào cả nên em nhờ anh chạy thử xem có phải tại em chạy chưa đúng hay do vấn đề gì đó mà em chưa biết anh ạ.
Tôi không đọc kỹ bài bạn. Có bạn trả lời thay rồi. File đó phải dùng ABBYY mới được.
 
Upvote 0
Em chào anh,
Em đã chạy thử và bị báo lỗi ở chỗ này:
wShell.Run comm & Chr(34) & Arr(K) & Chr(34) & Chr(32) & Chr(34) & FileName & Chr(34), 0, -1
Và thông báo lỗi hiện lên như vậy: Run-time error -2147024894(80070002)': Method Run' of object lWshShell3 ' failed
Cũng với file đó em chạy thử trên 1 máy khác thì lại không bị, kết quả rất tốt. Loay hoay mãi mà vẫn chưa tìm ra được nguyên nhân, nhờ anh xem giúp em liệu lỗi có thể ở đâu vậy ạ.

View attachment 288488

Bạn debug.Print xem dòng màu vàng.

Nếu trường hợp đường dẫn là tiếng Việt thì cần thêm mã GetShortPath.
 
Upvote 0
Web KT
Back
Top Bottom