循环访问PDF文件并将它们转换为带有单词的文档



我正在尝试使用VBA编码 - 我很陌生 - 从PDF中获取一系列.doc文档(不是图像(,也就是说,我正在尝试循环各种PDF文件并将它们保存为MS Word格式。我的经验是,word在我拥有的PDF文档中读得很好:word大部分时间都保持PDF文件的正确布局。我不确定这是否是解决这个问题的正确选择,我要求一个替代建议 - 如果可能的话,使用 R。

无论如何,这是我在这里找到的代码:

Sub convertToWord()
Dim MyObj As Object, MySource As Object, file As Variant
file = Dir("C:Usersusernamework_dir_example" & "*.pdf") 'pdf path
Do While (file <> "")
ChangeFileOpenDirectory "C:Usersusernamework_dir_example"
Documents.Open Filename:=file, ConfirmConversions:=False, ReadOnly:= _
False, AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:= _
"", Revert:=False, WritePasswordDocument:="", WritePasswordTemplate:="", _
Format:=wdOpenFormatAuto, XMLTransform:=""
ChangeFileOpenDirectory "C:Usersusernamework_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

将其粘贴到开发人员的窗口中后,我将代码保存在模块中 ->关闭开发人员的窗口 ->单击"宏"按钮 ->执行"convertToWord"宏。我在弹出框中收到以下错误:"未定义子或函数"。我该如何解决这个问题?另外,以前,由于我现在不清楚的某种原因,我遇到了与函数ChangeFileOpenDirectory相关的错误,该错误似乎也没有定义。

更新 27/08/2017

我将代码更改为以下内容:

Sub convertToWord()
Dim MyObj As Object, MySource As Object, file As Variant
file = Dir("C:Usersusernamework_dir_example" & "*.pdf")
ChDir "C:Usersusernamework_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

现在我在弹出框中没有收到任何错误消息,但我的工作目录中没有输出。现在可能有什么问题?

任何可以读取PDF文件和编写Word文档(XML(的语言都可以执行此操作,但是您喜欢的转换(打开PDF时Word所做的转换(将需要为应用程序本身使用API。 VBA是您简单的选择。

您发布的代码段(以及我下面的示例(使用早期绑定和枚举常量,这意味着我们需要对 Word 对象库的引用。 这已经为您在 Word 文档中编写的任何代码设置好了,因此请创建一个新的 Word 文档并将代码添加到标准模块中。(如果您需要更多详细信息,请参阅此 Excel 教程,我们的流程步骤是相同的(。

您可以从 VB 编辑器(使用"运行"按钮(或普通文档窗口(单击 Word 2010-2016 中"视图"选项卡上的"宏"按钮(运行宏。如果要重用宏而不再次设置代码,请将文档另存为 DOCM 文件。

现在是代码!

如注释中所述,如果您只确保文件夹路径以反斜杠"\"字符结尾,则第二个代码段有效。 修复后,它仍然不是很好的代码,但这将使您启动并运行。

我假设你想加倍努力,并有一个写得很好的版本,你可以稍后重新利用或扩展。 为简单起见,我们将使用两个过程:主转换和禁止显示 PDF 转换警告对话框的过程(由注册表控制(。

主要程序:

Sub ConvertPDFsToWord2()
Dim path As String
'Manually edit path in the next line before running
path = "C:usersusernamework_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

注册表设置功能:

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 = "HKCUSOFTWAREMicrosoftOffice" & _
Application.Version & "WordOptions"
'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

正如其他人所说,问题似乎主要在于路径和文件名。 这是您发布的代码的第二个版本,其中包含一些更改。

不幸的是,会弹出一条警告消息,将 DisplayAlerts 设置为 false 不会抑制它。 但是,如果您在第一次弹出时单击"不再显示此消息"复选框,则它不会继续为每个文件弹出。

Sub convertToWord()
Dim MyObj       As Object
Dim MySource    As Object
Dim file        As String
Dim path        As String
path = "C:Usersusernamework_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

最新更新