Forum


Replies: 3   Views: 690
Eliminando secciones y descargando el documento resultante
Topic closed:
Please note this is an old forum thread. Information in this post may be out-to-date and/or erroneous.
Every phpdocx version includes new features and improvements. Previously unsupported features may have been added to newer releases, or past issues may have been corrected.
We encourage you to download the current phpdocx version and check the Documentation available.

Posted by rmartinez  · 20-07-2022 - 08:13

Buenos días.

El proceso que tengo hasta ahora, básicamente, es el siguiente:

  • Abro un plantilla predeterminada con CreateDocxFromTemplate
  • Utilizo los métodos replaceVariableByWordFragment y replaceVariableByText para sustituir los placeholders con los valores que necesito
  • Descargo el documento con createDocxAndDownload

Todo funciona correctamente.

Ahora, antes de descargar el documento, en algunos casos, necesito eliminar la última sección del documento antes de descargarlo. Para ello, he visto que existe el método removeSection que se tiene que utilizar sobre un word ya almacenado. Así, antes de descargarlo, almaceno el word y le quito la última sección, sin problemas, pero, ahora, necesito un objeto correcto para poder utilizar el método createDocxAndDownload. He intentado utilizar el método CreateDocxFromTemplate con el word sin la última sección pero me tira el siguiente error en la línea 870 del fichero [...]/vendor/phpdocx/Classes/Phpdocx/Create/CreateDocx.php:

Argument 1 passed to DOMDocument::importNode() must be an instance of DOMNode, null given

¿Alguna idea?

Mi versión de phpdocx es la 8.5 Advanced.

Gracias.

Saludos.

Posted by admin  · 20-07-2022 - 08:38

Hola,

Hasta el lanzamiento de phpdocx 12, un DOCX necesitaba de al menos una sección (w:body/w:sectPr) para poder ser abierto por las clases CreateDocx y CreateDocxFromTemplate. Si eliminas la sección w:body/w:sectPr existente en un DOCX con removeSection, versiones antiguas de phpdocx no podrán abrirlo de nuevo para modificarlo. El método removeSection está pricipalmente enfocado en eliminar secciones intermedias; un documento DOCX debe contar al menos con una sección al final de su contenido (aunque algunos lectores de DOCX pueden leer documentos sin ninguna sección, otros programas pueden no ser capaces de leerlos).

En todo caso, para descargar un documento DOCX no es necesario utilizar el método createDocxAndDownload. Puedes generarlo con phpdocx y utilizar código de PHP directamente como se explica en https://www.phpdocx.com/documentation/cookbook/download-generated-docx

Os recomendamos actualizar phpdocx a la última versión disponible.

Saludos.

Posted by rmartinez  · 20-07-2022 - 08:54

Gracias por la pronta respuesta.

Si eliminas la sección w:body/w:sectPr existente en un DOCX con removeSection, versiones antiguas de phpdocx no podrán abrirlo de nuevo para modificarlo. El método removeSection está pricipalmente enfocado en eliminar secciones intermedias.

Entiendo que, si actualizo la versión de phpdocx, podré abrir el documento en cuestión, ¿no?

En todo caso, para descargar un documento DOCX no es necesario utilizar el método createDocxAndDownload. Puedes generarlo con phpdocx y utilizar código de PHP directamente como se explica en&nbsp;<a href="https://www.phpdocx.com/documentation/cookbook/download-generated-docx">https://www.phpdocx.com/documentation/cookbook/download-generated-docx</a>

La situación de generar un documento DOCX y descargarlo por php no me vale porque, insisto, necesito abrir un documento ya almacenado para seguir mi flujo de trabajo.

Gracias.

Saludos.

Posted by admin  · 20-07-2022 - 08:59

Hola,

Puedes hacer las pruebas correspondientes con el documento generado tras eliminar la sección con tu licencia actual de phpdocx 8.5 y abrirlo con el paquete trial de phpdocx 13 disponible (https://www.phpdocx.com/download_trial).

En todo caso, no recomendamos eliminar la última sección de un documento DOCX, ya que es un contenido necesario para un DOCX y su correcta lectura por visores DOCX. A partir de phpdocx 12, si un documento DOCX no contiene una etiqueta de sección en su final (w:body/w:sectPr), una nueva etiqueta de sección con valores por defecto es añadida al documento:

<w:sectPr><w:pgSz w:w="11906" w:h="16838"/><w:pgMar w:top="1417" w:right="1701" w:bottom="1417" w:left="1701" w:header="708" w:footer="708" w:gutter="0"/><w:cols w:space="708"/><w:docGrid w:linePitch="360"/></w:sectPr>

Saludos.