2017-08-25 20 views
8

Tôi đang cố gắng sử dụng mã VBA - mà tôi khá mới - để có được một loạt tài liệu .doc từ tệp PDF (không phải là hình ảnh), nghĩa là, tôi đang cố gắng lặp lại các tệp PDF khác nhau và lưu chúng ở định dạng MS Word. Kinh nghiệm của tôi là từ đọc khá tốt các tài liệu PDF mà tôi có: từ duy trì bố cục chính xác của tập tin PDF hầu hết thời gian. Tôi không chắc liệu đây có phải là lựa chọn đúng đắn để giải quyết vấn đề này hay không và tôi yêu cầu một đề nghị thay thế - sử dụng R, nếu có thể.Lặp qua các tệp PDF và chuyển đổi chúng thành tài liệu với từ

Dù sao, ở đây nó là mã mà tôi tìm thấy here:

Sub convertToWord() 

    Dim MyObj As Object, MySource As Object, file As Variant 

    file = Dir("C:\Users\username\work_dir_example" & "*.pdf") 'pdf path 

    Do While (file <> "") 

    ChangeFileOpenDirectory "C:\Users\username\work_dir_example" 

      Documents.Open Filename:=file, ConfirmConversions:=False, ReadOnly:= _ 
     False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _ 
     "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _ 
     Format:=wdOpenFormatAuto, XMLTransform:="" 

    ChangeFileOpenDirectory "C:\Users\username\work_dir_example" 

    ActiveDocument.SaveAs2 Filename:=Replace(file, ".pdf", ".docx"), FileFormat:=wdFormatXMLDocument _ 
     , LockComments:=False, Password:="", AddToRecentFiles:=True, _ 
     WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ 
     SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ 
     False, CompatibilityMode:=15 

    ActiveDocument.Close 

    file = Dir 

    Loop 

End Sub 

Sau khi dán nó trong cửa sổ của nhà phát triển, tôi lưu các mã trong một mô-đun -> Tôi đóng cửa sổ của nhà phát triển -> tôi bấm vào nút "Macro" -> Tôi thực thi macro "convertToWord". Tôi nhận được lỗi sau trong một cửa sổ bật lên hộp: "Sub hoặc chức năng không được xác định". Làm thế nào để sửa lỗi này? Ngoài ra, trước đây, vì một số lý do mà không rõ ràng với tôi bây giờ, tôi đã nhận được một lỗi liên quan đến chức năng ChangeFileOpenDirectory, mà dường như không được xác định cũng có.

Cập nhật 27/08/2017

tôi đã thay đổi mã như sau:

Sub convertToWord() 

    Dim MyObj As Object, MySource As Object, file As Variant 

    file = Dir("C:\Users\username\work_dir_example" & "*.pdf") 

    ChDir "C:\Users\username\work_dir_example" 

    Do While (file <> "") 

     Documents.Open Filename:=file, ConfirmConversions:=False, ReadOnly:= _ 
     False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _ 
     "", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _ 
     Format:=wdOpenFormatAuto, XMLTransform:="" 

     ActiveDocument.SaveAs2 Filename:=Replace(file, ".pdf", ".docx"), FileFormat:=wdFormatXMLDocument _ 
     , LockComments:=False, Password:="", AddToRecentFiles:=True, _ 
     WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, _ 
     SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= _ 
     False, CompatibilityMode:=15 

    ActiveDocument.Close 

    file = Dir 

    Loop 

End Sub 

Bây giờ tôi không nhận được bất kỳ thông báo lỗi trong một hộp pop-up, nhưng không có đầu ra trong thư mục làm việc của tôi. Điều gì có thể sai với nó ngay bây giờ?

+2

(a) Là 'Dir ("C: \ Users \ ... t" & "* .pdf") 'ngụ ý rằng thư mục của bạn kết thúc bằng' t'? Nếu vậy, điều đó nên nói 'Dir (' C: \ Users \ ... t \ "&" * .pdf ")' (hoặc, để tiết kiệm một chút thời gian xử lý, 'Dir (" C: \ Users \ ... t \ *. pdf ")'). (b) Tôi không chắc tại sao 'ChangeFileOpenDirectory' sẽ thất bại, ngoài thư mục bạn chỉ định không tồn tại hoặc bạn không có quyền truy cập vào nó. – YowE3K

+1

chỉ cần xóa hai dòng 'ChangeFileOpenDirectory ...'. mở và lưu tệp bằng đường dẫn đầy đủ – jsotola

+0

Tôi đã thử một số đề xuất. Tôi sẽ cập nhật câu hỏi. –

Trả lời

2

Bất kỳ ngôn ngữ có thể đọc các file PDF và viết tài liệu Word (mà là XML) có thể làm được điều này, nhưng việc chuyển đổi mà bạn thích (mà Word không khi PDF được mở ra) sẽ đòi hỏi sử dụng một API cho ứng dụng chinh no. VBA là lựa chọn dễ dàng của bạn.

Đoạn mã bạn đã đăng (và mẫu của tôi bên dưới) sử dụng các hằng số ràng buộc và liệt kê sớm, có nghĩa là chúng ta cần tham chiếu đến thư viện đối tượng Word. Điều đó đã được thiết lập cho bất kỳ mã nào bạn viết trong một tài liệu Word, vì vậy hãy tạo một tài liệu Word mới và thêm mã vào một mô-đun chuẩn. (Xem số Excel tutorial này nếu bạn cần thêm chi tiết, các bước cho quy trình của chúng tôi giống nhau).

Bạn có thể chạy macro của mình từ Trình chỉnh sửa VB (sử dụng nút Chạy) hoặc từ cửa sổ tài liệu bình thường (nhấp vào nút Macro trên tab Xem trong Word 2010-2016). Lưu tài liệu của bạn dưới dạng tệp DOCM nếu bạn muốn sử dụng lại macro mà không cần thiết lập lại mã.

Bây giờ cho mã!

Như đã nêu trong nhận xét, đoạn thứ hai của bạn hợp lệ nếu bạn chỉ đảm bảo rằng đường dẫn thư mục của bạn kết thúc bằng ký tự dấu chéo ngược "\". Nó vẫn không phải là mã tuyệt vời sau khi bạn sửa lỗi đó, nhưng điều đó sẽ giúp bạn bắt đầu và chạy.

Tôi giả sử bạn muốn đi thêm dặm và có phiên bản được viết rõ ràng về điều này bạn có thể sử dụng lại hoặc mở rộng sau này.Để đơn giản, chúng tôi sẽ sử dụng hai thủ tục: chuyển đổi chính và một thủ tục để ngăn chặn hộp thoại cảnh báo chuyển đổi PDF (được kiểm soát bởi đăng ký).

thủ tục chi tiết:

Sub ConvertPDFsToWord2() 
    Dim path As String 
    'Manually edit path in the next line before running 
    path = "C:\users\username\work_dir_example\" 

    Dim file As String 
    Dim doc As Word.Document 
    Dim regValPDF As Integer 
    Dim originalAlertLevel As WdAlertLevel 

'Generate string for getting all PDFs with Dir command 
    'Check for terminal \ 
    If Right(path, 1) <> "\" Then path = path & "\" 
    'Append file type with wildcard 
    file = path & "*.pdf" 

    'Get path for first PDF (blank string if no PDFs exist) 
    file = Dir(file) 

    originalAlertLevel = Application.DisplayAlerts 
    Application.DisplayAlerts = wdAlertsNone 

    If file <> "" Then regValPDF = TogglePDFWarning(1) 

    Do While file <> "" 
     'Open method will automatically convert PDF for editing 
     Set doc = Documents.Open(path & file, False) 

     'Save and close document 
     doc.SaveAs2 path & Replace(file, ".pdf", ".docx"), _ 
        fileformat:=wdFormatDocumentDefault 
     doc.Close False 

     'Get path for next PDF (blank string if no PDFs remain) 
     file = Dir 
    Loop 

CleanUp: 
    On Error Resume Next 'Ignore errors during cleanup 
    doc.Close False 
    'Restore registry value, if necessary 
    If regValPDF <> 1 Then TogglePDFWarning regValPDF 
    Application.DisplayAlerts = originalAlertLevel 

End Sub 

thiết lập Registry chức năng:

Private Function TogglePDFWarning(newVal As Integer) As Integer 
'This function reads and writes the registry value that controls 
'the dialog displayed when Word opens (and converts) a PDF file 
    Dim wShell As Object 
    Dim regKey As String 
    Dim regVal As Variant 

    'setup shell object and string for key 
    Set wShell = CreateObject("WScript.Shell") 
    regKey = "HKCU\SOFTWARE\Microsoft\Office\" & _ 
      Application.Version & "\Word\Options\" 

    'Get existing registry value, if any 
    On Error Resume Next 'Ignore error if reg value does not exist 
    regVal = wShell.RegRead(regKey & "DisableConvertPdfWarning") 
    On Error GoTo 0  'Break on errors after this point 

    wShell.regwrite regKey & "DisableConvertPdfWarning", newVal, "REG_DWORD" 

    'Return original setting/registry value (0 if omitted) 
    If Err.Number <> 0 Or regVal = 0 Then 
     TogglePDFWarning = 0 
    Else 
     TogglePDFWarning = 1 
    End If 

End Function 
+0

Tôi gặp sự cố với chức năng 'TogglePDFWarning'. Tôi có chèn nó vào mô-đun khác không? Tôi có cần thư viện để gọi đúng không? –

+0

Tôi đã giải quyết được sự cố. Tôi cần nhập hàm riêng như một thủ tục. Vì bạn đã xoay xở để có được câu trả lời - và tôi không thể kiểm tra xem bạn có đúng thời điểm đúng không -, có cách nào để 'tặng' thêm 25 điểm cho bạn không? –

+0

Tiền thưởng đã được nhận. Cảm ơn bạn đã kiểm tra lại! – AjimOthy

1

Như những người khác đã nêu, vấn đề dường như nằm chủ yếu với đường dẫn tên &. Đây là phiên bản thứ hai của mã bạn đã đăng với một số thay đổi.

Thật không may, một thông báo cảnh báo bật lên và đặt DisplayAlerts thành false sẽ không chặn nó. Nhưng nếu bạn nhấp vào hộp kiểm "không hiển thị lại thông báo này" trong lần đầu tiên nó xuất hiện, thì nó sẽ không tiếp tục bật lên cho mọi tệp.

Sub convertToWord() 

    Dim MyObj  As Object 
    Dim MySource As Object 
    Dim file  As String 
    Dim path  As String 

    path = "C:\Users\username\work_dir_example\" 
    file = Dir(path & "*.pdf") 

    Do While (file <> "") 
     Documents.Open FileName:=path & file 
     With ActiveDocument 
      .SaveAs2 FileName:=Replace(path & file, ".pdf", ".docx"), _ 
           FileFormat:=wdFormatXMLDocument 
      .Close 
     End With 
     file = Dir 
    Loop 

End Sub 
Các vấn đề liên quan