vba - una - macro para imprimir en pdf
Pasa el cursor por los archivos PDF y transfórmalos en un documento con la palabra (2)
Como otros han declarado, el problema parece residir principalmente en la ruta y el nombre del archivo. Aquí está la segunda versión del código que publicó con algunos cambios.
Lamentablemente, aparece un mensaje de advertencia y al configurar DisplayAlerts en falso no lo suprime. Pero si hace clic en la casilla de verificación "No mostrar este mensaje nuevamente" la primera vez que aparece, no continuará apareciendo para cada archivo.
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
Estoy tratando de usar la codificación VBA, que soy bastante nuevo, para obtener una serie de documentos .doc de archivos PDF (que no son imágenes), es decir, estoy intentando recorrer varios archivos PDF y guardarlos en MS Word formato. Mi experiencia es que la palabra lee bastante bien los documentos PDF que tengo: la palabra mantiene el diseño correcto del archivo PDF la mayor parte del tiempo. No estoy seguro de si esta es la opción correcta para abordar esto y pido una sugerencia alternativa, utilizando R, si es posible.
De todos modos, aquí está el código que encontré aquí :
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
Después de pegarlo en la ventana del desarrollador, guardo el código en un módulo -> cierro la ventana del desarrollador -> hago clic en el botón "Macros" -> ejecuto la macro "convertToWord". Aparece el siguiente error en un cuadro emergente: "Sub o Función no definida". ¿Cómo puedo solucionar esto? Además, anteriormente, por algún motivo que ahora no me queda claro, recibí un error relacionado con la función ChangeFileOpenDirectory
, que tampoco parecía estar definida.
Actualización 27/08/2017
Cambié el código a lo siguiente:
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
Ahora no recibo ningún mensaje de error en un cuadro emergente, pero no hay ningún resultado en mi directorio de trabajo. ¿Qué podría estar mal con eso ahora?
Cualquier lenguaje que pueda leer archivos PDF y escribir documentos de Word (que son XML) puede hacer esto, pero la conversión que desee (que Word hace cuando se abre el PDF) requerirá el uso de una API para la aplicación en sí. VBA es su opción fácil.
Los fragmentos que ha publicado (y mis muestras a continuación) usan constantes de enumeración y de enlace temprano, lo que significa que necesitamos una referencia a la biblioteca de objetos de Word. Eso ya está configurado para cualquier código que escriba en un documento de Word, así que cree un nuevo documento de Word y agregue el código en un módulo estándar. (Consulte este tutorial de Excel si necesita más detalles, los pasos para nuestro proceso son los mismos).
Puede ejecutar su macro desde el Editor de VB (utilizando el botón Ejecutar) o desde la ventana del documento normal (haga clic en el botón Macros en la pestaña Vista en Word 2010-2016). Guarde su documento como un archivo DOCM si desea reutilizar la macro sin configurar el código nuevamente.
¡Ahora para el código!
Como se indica en los comentarios, su segundo fragmento es válido si solo se asegura de que las rutas de su carpeta finalicen con un carácter "/" de barra invertida. Todavía no es un gran código después de corregirlo, pero eso lo pondrá en marcha.
Asumiré que desea hacer un esfuerzo adicional y tener una versión bien escrita de esto que podría reutilizar o ampliar más adelante. Para simplificar, utilizaremos dos procedimientos: la conversión principal y un procedimiento para suprimir el cuadro de diálogo de advertencia de conversión de PDF (controlado por el registro).
Procedimiento principal:
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
Función de configuración del registro:
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