gpt4 book ai didi

vba - 循环PDF文件并将它们转换为带有word的文档

转载 作者:行者123 更新时间:2023-12-04 07:32:49 26 4
gpt4 key购买 nike

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

无论如何,这是我找到的代码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

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

2017 年 8 月 27 日更新

我将代码更改为以下内容:
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

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

最佳答案

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

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

您可以从 VB 编辑器(使用“运行”按钮)或普通文档窗口(单击 Word 2010-2016 中“查看”选项卡上的“宏”按钮)运行宏。如果您想在不重新设置代码的情况下重复使用宏,请将您的文档另存为 DOCM 文件。

现在看代码!

如评论中所述,如果您确保文件夹路径以反斜杠“\”字符结尾,则您的第二个片段是有效的。在你修复它之后它仍然不是很好的代码,但这会让你启动并运行。

我假设您想加倍努力并拥有一个编写良好的版本,您可以稍后重新调整用途或扩展。为简单起见,我们将使用两个过程:主转换和抑制 PDF 转换警告对话框(由注册表控制)的过程。

主要程序:

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

注册表设置功能:
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

关于vba - 循环PDF文件并将它们转换为带有word的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45890170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com