Recrear archivo PDF de Java a PHP

Tengo un servicio web en Java (usando Apache Axis) que obtiene la identificación de un documento y esta llamada a JasperReports para crear un archivo PDF (informe creado previamente en la aplicación Java - lado del servidor), para crear el informe estoy usando los métodos : JasperManager.fillReport y JasperExportManager.exportReportToPdf. El último devuelve una matriz de bytes. Mi servicio web toma la matriz y la codifica en una cadena Base64, PHP recibe esta cadena como respuesta del servicio web.

Quiero recrear el archivo en PHP, pero no sé exactamente si esto es posible. Estoy tratando de hacer esto con el siguiente fragmento:

private function createFileFromString($stringWithFile){
    header('Content-Description: File Transfer');
    header("Content-Type: application/pdf");
    header('Content-Disposition: attachment; filename=remesa.pdf');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    ob_start();
    ob_clean();
    ob_flush();
    flush();
    $fp = file_put_contents("document.pdf", "w");
    fwrite($fp, base64_decode($stringWithFile));
    readfile($fp);
    ob_get_contents();
    fclose($fp);
    exit();
}

El servicio web devuelve una cadena como esta:

JVBERi0xLjQKJeLjz9MKNCAwIG9iaiA8PC9UeXBlL1hPYmplY3QvQ29sb3JTcGFjZS9EZXZpY2VS R0IvU3VidHlwZS9JbWFnZS9CaXRzUGVyQ29tcG9uZW50IDgvV2lkdGggMjg0L0xlbmd0aCAzNjc0 L0hlaWdodCA1MC9GaWx0ZXIvRENURGVjb2RlPj5zdHJlYW0K/9j/4AAQSkZJRgABAgAAAQABAAD/ 2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0 Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAyARwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA...

Esta cadena tiene el "Encabezado PDF", comienza así:

%PDF-1.4 %âãÏÓ 4 0 obj <>flujo ÿØÿà

Cuando trato de descargar el archivo, su tamaño es de alrededor de 4-5 KB (y el archivo está dañado), pero la cadena de respuesta es de alrededor de 180 KB.

es posible? ¿Qué estoy haciendo mal?

EDITAR: he leído sobre deshacer función, tal vez esta función me puede ayudar?

Gracias por adelantado

preguntado el 12 de junio de 12 a las 22:06

1 Respuestas

Vale, lo resolví. Tengo, básicamente, dos errores:

1. Desde Java: La clase que he usado para codificar el contenido del archivo PDF (org.w3c.tools.codec.Base64Encoder) estaba corrompiendo la cadena con el contenido del archivo, en lugar de esta clase, cambié a Apache Axis Tools (org.apache.axis.encoding.Base64). Digo esto porque comparé el contenido de un PDF generado con mi aplicación Java y el contenido devuelto por WebService y el último es un poco más pequeño.

2. Desde PHP: construyendo el archivo: En esta parte he intentado hacer esto:

$fp = file_put_contents("document.pdf", "w");
fwrite($fp, base64_decode($stringWithFile));
readfile($fp);

Pero, solo con file_put_contents he terminado de escribir el contenido en un archivo PDF, fwrite no fue necesariamente en este punto. Estoy generando el pdf con este fragmento:

private function createFileFromString($stringWithFile){
    header('Content-Description: File Transfer');
    header("Content-Type: application/pdf");
    header('Content-Disposition: attachment; filename=document.pdf');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    flush();
    file_put_contents("document.pdf", base64_decode($stringWithFile));
    readfile("document.pdf");
    exit();
}

Espero que esta respuesta ayude a todos.

Respondido el 13 de junio de 12 a las 14:06

gracias por tomarse el tiempo para responder a su propia pregunta. Estoy seguro de que ayudará a alguien más en el futuro. Solo para que sepa que puede marcar su propia respuesta como aceptada haciendo clic en la marca de verificación en la parte superior izquierda junto a la respuesta. - jacob schoen

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.