Forum


Replies: 6   Views: 2123
Problemas con la generación de pdfs
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  · 25-02-2019 - 08:45

Buenas.

Estoy intentando exportar a pdf un archivo generado con vuestra librería y, después de varios intentos y configuraciones, no logro generar el PDF. Lo he probado con LibreOffice y nada, llego a la conclusión de que, simplemente, no genera el PDF y, obviamente, me tira un error en la funcion rename porque el fichero pdf no existe. Con el método transformDocument, he probado todas las opciones, method y odfconverter.

En el archivo phpdocxconfig.ini tengo la siguiente configuración:

method = "libreoffice"
path = "/usr/lib/libreoffice/program/soffice"

En vuestra documentación, he seguido los pasos indicados para intentar resolver el problema:
1. La conversión a pdf desde la línea de comandos funciona
2. Sólo hay una instalación de LibreOffice ubicada en /usr/lib/libreoffice/program/soffice
3. No he podido ejecutar el código de ejemplo en el modo CLI, me tira el siguiente error:

PHP Fatal error:  Uncaught Error: Class 'CreateDocx' not found in /var/www/clients/client2/web6/web/reports/public/test.php:5
Stack trace:
#0 {main}
  thrown in /var/www/clients/client2/web6/web/reports/public/test.php on line 5

El código que estoy intentando ejecutar es el siguiente:

<?php
// instantiate the CreateDocx class in a new object
require_once '../vendor/phpdocx/Classes/Phpdocx/Create/CreateDocx.php';

$docx = new CreateDocx();

// enable the compatibility mode to allow the library to warn us in case of using non-compatible content
$docx->enableCompatibilityMode();

// add a text to the document
$text = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit';
$docx->addText($text, $paramsText);

// generate the new document
$docx->createDocx('test.docx');

// and make the transformation to PDF file
$docx->transformDocument('test.docx', 'test.pdf');
?>

No estoy seguro que problema sea por permisos porque he podido renombrar un fichero en la carpeta de destino a través de la función passthru

Por si sirve de algo, estoy trabajando con el framework Laravel 5.5.43 y dispongo de vuestra librería avanzada

¿Alguna ayuda para, finalmente, poder generar un pdf con vuestra librería?

Posted by admin  · 25-02-2019 - 09:06

Hola,

Como comentas que desde la línea de comandos funciona, el problema más común es la ausencia de permisos para el directorio .config del usuario del servidor web.

Te recomendamos leer la documentación disponible en https://www.phpdocx.com/documentation/conversion-plugin/common-problems-and-possible-errors (sección LibreOffice Linux common problems and issues). Tras averiguar el valor del directorio HOME del servidor mediante el método getenv, solo es necesario asignar permisos 777 para el subdirectorio .config. Mediante putenv puedes asignar un directorio HOME personalizado. En la página anterior puedes ver todo esto detallado. Si mandas a contact[at]phpdocx.com acceso por SSH al servidor, la ruta donde está instalado phpdocx y una URL para probarlo mediante una navegador web, accederemos al servidor para hacer las pruebas y configuraciones necesarias.

Con respecto a este código:

<?php
// instantiate the CreateDocx class in a new object
require_once '../vendor/phpdocx/Classes/Phpdocx/Create/CreateDocx.php';

$docx = new CreateDocx();

no es correcto, PHP no es capaz de encontrar la clase. Al estar utilizando la versión con PHP namespaces, si no indicas un línea use, necesitas especificar la ruta completa de namespaces. Aunque puedes ver ejemplos en el paquete y en la documentación (https://www.phpdocx.com/documentation/practical/creating-a-new-document), este es un ejemplo:

require_once 'Classes/Phpdocx/Create/CreateDocx.php';

$docx = new Phpdocx\Create\CreateDocx();

De todas maneras, al estar utilizando Laravel, te recomendamos integrar el autoloader en composer: https://www.phpdocx.com/documentation/cookbook/integrate-phpdocx-with-laravel

Saludos.

Posted by rmartinez  · 25-02-2019 - 10:20

Comento:

  1. El valor del directorio HOME del servidor es /root.
  2. Le he asignado permisos 777 a /root/.config/ de manera recursiva
    root@XXXXXX:~/.config# ls -la
    total 11
    drwxrwxrwx  5 root root  5 feb 22 11:42 .
    drwx------ 18 root root 30 feb 25 09:18 ..
    drwxrwxrwx  2 root root  5 jul 10  2018 composer
    drwxrwxrwx  3 root root  3 feb 22 11:42 libreoffice
    drwxrwxrwx  2 root root  3 ago  3  2018 psysh

     

  3. El siguiente código, sí me crea el pdf por modo CLI pero no a través del navegador:
    // instantiate the CreateDocx class in a new object
    require_once '../vendor/phpdocx/Classes/Phpdocx/Create/CreateDocx.php';
    $docx = new Phpdocx\Create\CreateDocx();
    
    // enable the compatibility mode to allow the library to warn us in case of using non-compatible content
    $docx->enableCompatibilityMode();
    
    // add a text to the document
    $text = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit';
    $docx->addText($text, $paramsText);
    
    // generate the new document
    $docx->createDocx('test.docx');
    
    // and make the transformation to PDF file
    $docx->transformDocument('test.docx', 'test.pdf');

¿Alguna idea más?

Gracias de antemano.

Saludos.

Posted by admin  · 25-02-2019 - 10:31

Hola,

El servidor web no puede entrar a /root/.config porque por motivos de seguridad /root tiene permisos 700, es decir solo puede acceder root, y por lo tanto a sus subdirectorios solo puede acceder root también. No es nada recomendable utilizar /root como HOME de un servidor web (se utilice libreoffice o no).

Te recomendamos utilizar un directorio web fuera de /root, por ejemplo /var/www o /var/html o similar. Esto puedes personalizarlo con la configuración de PHP, o utilizando putenv antes de hacer la transformación.

Por ejemplo, para /var/www, se crea el directorio .config:

mkdir /var/www/.config

se asignan permisos 777 (o solo para el usuario específico del servidor web):

chmod 777 -R /var/www/.config

y se asigna el nuevo directorio para HOME con putenv si no se ha definido en la configuración de PHP:

putenv("HOME=/var/www");
$docx->transformDocument('test.docx', 'test.pdf');

Saludos.

Posted by rmartinez  · 25-02-2019 - 11:15

Buenas.

Hice lo que comentas y el código de prueba me funcionó también en el navegador. Después, intenté replicarlo en mi código, dentro de un controlador y no me funcionó, me sigue dando el error del rename. Pero es que, además, ahora, tampoco funciona el código de prueba que anteriormente sí lo hacía, también me devuelve el error de rename.

Entonces, eliminé la carpeta .config de /var/www, la volví a crear, le asigné permisos y sigue sin funcionar. ¿Qué está pasando?

Por si ayuda, uso el IPSConfig para gestionar todo el tema de alojamientos, php, ftp, bases de datos, etc.

Gracias.

Saludos.

Posted by admin  · 25-02-2019 - 11:28

Hola,

Lo sentimos, pero no sabemos por qué antes un código te funcionaba y ahora no. Crear un directorio en /var/www.config no afecta a otros directorios ni archivos, y la función putenv funciona solo mientras corre el script, finalizada su ejecución el valor de HOME vuelve a su valor original.

Como funciona de manera standalone la conversión, el problema debe venir por alguna configuración que esté pisando PHP o que el directorio HOME utilizado no es el correcto o exista algún problema en el controlador. Te recomendamos revisar los logs del servidor y obtener/definir los valores de HOME para el usuario del servidor web para encontrar el origen del problema.

Si mandas a contact[at]phpdocx.com acceso por SSH al servidor, la ruta donde está instalado phpdocx y una URL para probarlo mediante una navegador web, accederemos para hacer las pruebas y configuraciones necesarias.

Saludos.

Posted by admin  · 01-03-2019 - 20:34

A nota informativa, el problema era debido a la ausencia de un directorio .config correctamente configurado. Tras detener los procesos colgados de LibreOffice, era necesario aplicar permisos 777 a ese directorio.