Renombrar páginas como ficheros independientes pdf
Tengo un archivo pdf de pongamos 20 pag. Mi pregunta es como puedo extraer esas 20 páginas en 20 archivos independientes dándoles a cada una un nombre de fichero distinto. Extraer las páginas como ficheros independientes sé como se hace, pero al extraerlas quisiera darles yo el nombre de fichero que me interese a cada una. ¿Hay alguna forma o código VB para hacerlo?
2 respuestas
Hol.a
No has mencionado que versión de VB usas.
Salu2
Abraham Valencia
Te lo voy a poner más fácil, o eso creo. En lugar de que el archivo sea un .pdf sería tener un documento word combinado (con campos de una tabla de excel) de 20 pág. y usando el módulo Vb que trae word, hacer una macro que me cree un fichero distinto con cada una de las páginas y que tenga como nombre del fichero uno de los campos combinados del documento.
No sé si me has llegado a coger la idea.
Gracias.
Hol.a
El entorno de programación de Office es el VBA, no VB por si acaso (no son lo mismo).
Como para que te des idea, la macro que te voy a dejar de ejemplo convierte cada una de las páginas de un archivo Word (cualquiera sea el número) en un archivo pdf independiente. En el ejemplo hay una ruta determinada (que tú debes cambiar a la tuya) y el nombre de cada archivo es "pdfdepagina" más el número de página:
Sub ConvertiraPDF() Dim nPaginas As Integer, x As Integer Let nPaginas = ActiveDocument.ComputeStatistics(wdStatisticPages) For x = 1 To nPaginas ActiveDocument.ExportAsFixedFormat OutputFileName:= _ "C:\Users\EAVJ\Documents\pdfdepagina" & x & ".pdf", ExportFormat:=wdExportFormatPDF, _ OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:= _ wdExportFromTo, From:=x, to:=x, Item:=wdExportDocumentContent, _ IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _ wdExportCreateNoBookmarks, DocStructureTags:=True, BitmapMissingFonts:= _ True, UseISO19005_1:=False Next x End Sub
Comentas
Abraham Valencia
Gracias Abraham, es exactamente lo que quería pero con un matiz, a ver si rizamos el rizo.
Al ser un documento combinado, ¿ los pdf que me va generando por cada página, podrían llevar como nombre de fichero uno de los campos del documento?....... imagínate que hay un campo que es 'farmacia'. Pues, que al generarse el pdf tomaran como nombre el campo de 'farmacia'. Imagínate, es un documento de 497 páginas personalizadas que he de enviar cada página a la farmacia correspondiente que figura dentro del campo [farmacia]. ¿Sería posible?.
Gracias de antemano.
Para capturar el valor que tiene un campo que proviene de "Combinar correspondencia", usa algo así:
Activedocument.MailMerge.DataSource.DataFields("Nombre_del_Campo").Value
Salu2
Abraham Valencia
Gracias de nuevo.
Este es el código que tengo en el documento ya combinado, el que tiene las 497 páginas.
FARMA = ActiveDocument.MailMerge.DataSource.DataFields("FARMACIA").Value
Pero al ejecutarlo me da el error: 5852 "el objeto solicitado no está disponible".
¿Qué puede ser?.
Este es el código que me enviaste anteriormente y donde he insertado este nuevo para capturar el campo combinado:
Let nPaginas = ActiveDocument.ComputeStatistics(wdStatisticPages)
For x = 1 To nPaginas
FARMA = ActiveDocument.MailMerge.DataSource.DataFields("FARMACIA").Value
ActiveDocument.ExportAsFixedFormat OutputFileName:= _
ruta & "\" & "Far_" & FARMA & ".pdf", ExportFormat:=wdExportFormatPDF, _
OpenAfterExport:=False, OptimizeFor:=wdExportOptimizeForPrint, Range:= _
wdExportFromTo, From:=x, To:=x, Item:=wdExportDocumentContent, _
IncludeDocProps:=True, KeepIRM:=True, CreateBookmarks:= _
wdExportCreateNoBookmarks, DocStructureTags:=True, BitmapMissingFonts:= _
True, UseISO19005_1:=False
Next x
End Sub
Seguro, lo he mirado en el documento original, el que se usa para la combinación de la correspondencia.
A no ser que no se pueda capturar el valor de un campo de un documento ya combinado.
Si se puede capturar el valor que mencionas pero antes dos cosas: Primero, dentro de un "For" en el cual hay una variable no tiene sentido dar el mismo nombre siempre, si tu intención es que cada hoja tenga el nombre de cada valor de ese campo tienes que "mover" el recordset; segundo, no mencionaste en que línea da el error.
Abraham Valencia
En esta línea es donde me da el error
FARMA = ActiveDocument.MailMerge.DataSource.DataFields("FARMACIA").Value
Primero saca que nada, verifica el nombre del campo, anda a la pestaña "Correspondencia" y en el grupo "Escribir e insertar campos" dale click a "Insertar campo combinado" y te aparecerán los nombres de todos los campos. Otra cosa, si dejas tal cual tu macro, siempre intentará dar el mismo nombre así que antes del "Next" debes colocar esto:
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdNextRecord
Abraham Valencia
Buenos dias por allá. Definitivamente, el nombre del campo es "FARMACIA".
Porque.... ¿estamos seguro que el código vba hay que incluirlo en el documento ya combinado?, o ¿tendría que estar en el documento que se creó para la combinación? .
Salu2
A ver, para hablar los mismos terminos, cuando desde Word se usa la herramienta "Combinar correspondencia" tenemos dos documentos: La "base de datos" (Excel, Access, MySQL, etc.) y la "Carta" que es un documento de Word (aunque bien sabemos que no necesariamente la usaremos como una carta propiamente dicha).
Entonces cuando ya se realizó la "combinación", en la "carta" incluimos el código que estás intentando implementar y no debería tener problemas si el campo se llama tal cual mencionas. Si tienes todo en la "carta" y ya verificaste el nombre del campo, quizá por ahí el campo tiene un espacio delante o detrás y por eso el problema. Abre lo que te mencioné de "insertar campo combinado" y envía una captura de pantalla por aquí.
Abraham Valencia
¿Estás usando Word 2007 o 2010?
En ese mismo archivo inserta un módulo standard y pega esto:
Sub Prueba1() Dim nCampos As Integer Let nCampos = ActiveDocument.MailMerge.DataSource.DataFields.Count MsgBox nCampos End Sub Sub Prueba2() Dim cadena As String Let cadena = ActiveDocument.MailMerge.DataSource.DataFields("FARMACIA").Value MsgBox cadena End Sub
Corre la macro "Prueba1" primero y luego la otra y comenta por favor los resultados. No olvides mencionar tu versión de Word, no es raro ese error en esas versiones.
Abraham Valencia
He corrido la macro Prueba1 y me ha dado como resultado nCampos = 0
La macro Prueba2 me sigue dando error de "el elemento no está disponible" en la línea "Let cadena = ActiveDocument.MailMerge.DataSource.DataFields("FARMACIA").Value"
La versión de Ms Office es la 2010.
Salu2
Según la captura de pantalla y los resultados de la macro, es como que la combinación propiamente dicha aún no está finalizada/iniciada en ese documento en especifico. Veo, aparentemente, que detrás de la captura dice "Farmacia N°..." y quizá el campo "Farmacia" pero ¿vacío? O sea solo con el nombre del campo a pesar de que aparentemente debería estar en el registro número 1.
Abraham Valencia
Pues la verdad es que ya he hecho todo tipo de pruebas y sigo igual. He vuelto a combinar el documento, le he insertado los códigos Prueba1 y Prueba2 que me enviaste y me sigue dando el mismo error "error 5852 el elemento solicitado no está disponible". Sigo buscando por ahí porque ya no sé qué más hacer. Si se te ocurre algo más...
Gracias por todo. Un saludo.
Tres cosas más: ¿De qué base de datos provienen los datos? ¿Tiene clave? Y segundo, ¿intentaste cunado hay algún registro en el Word? Porque como comente en el mensaje anterior, parecía que el campo estaba vacío. Tercero ¿tu Office está actualizado al SP2 o al menos al SP1? Como también comenté, algo de un error en Office 2010 recuerdo relacionado a lo que te sucede cuando no tenían el Office actualizado.
Abraham Valencia
Los datos para la combinación provienen de un fichero excel. Sin clave. Mi Office 2010 tiene el SP2
Se nos presenta un reto........
Un saludo
- Compartir respuesta
Para extraer páginas de forma individual puedes hacerlo con un software que te permite hacer esta tarea, es uno de los más completos.
- Compartir respuesta