Вопрос по web-services, php, jasper-reports – Воссоздать PDF-файл с Java на PHP

2

У меня есть WebService в Java (с использованием Apache Axis), который получает идентификатор документа и этот вызов JasperReports для создания PDF-файла (отчет, ранее созданный на стороне приложения java - сервера), для создания отчета, который я использую с помощью методы: JasperManager.fillReport и JasperExportManager.exportReportToPdf. Последний возвращает массив байтов. Мой веб-сервис берет массив и кодирует его в строку Base64, PHP получает эту строку в ответ от WebService.

Я хочу воссоздать файл в PHP, но я не знаю точно, возможно ли это. Я пытаюсь сделать это с помощью следующего фрагмента:

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();
}

WebService возвращает строку вроде этого:

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

Эта строка имеет заголовок «PDF Header», который начинается следующим образом:

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

Когда я пытаюсь загрузить файл, его размер составляет около 4-5 КБ (и файл поврежден), но строка ответа составляет около 180 КБ.

Это возможно? Что я делаю не так?

EDIT: I've read about распаковывать функция, может быть, эта функция может помочь мне?

заранее спасибо

Ваш Ответ

1   ответ
2

1. From Java: Класс, который я использовал для кодирования содержимого файла PDF (org.w3c.tools.codec.Base64Encoder) искажал строку строкой с содержимым файла, вместо этого я переключился на инструменты Apache Axis (org.apache.axis.encoding.Base64). Я говорю это потому, что я сравнил содержимое PDF-файла, созданного с моим Java-приложением, и содержимое, возвращенное из WebService, а последнее немного меньше.

2. From PHP: Building The File: В этой части я пытаюсь сделать это:

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

Но только после того, как file_put_contents я выполнил запись содержимого в PDF-файл, писать его не обязательно на этом этапе. Я создаю pdf с помощью этого фрагмента:

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();
}

Я надеюсь, что этот ответ поможет всем.

спасибо, что поделились этим замечательным случаем!
спасибо, что нашли время ответить на свой вопрос. Я уверен, что это поможет кому-то еще в будущем. Просто чтобы вы знали, что вы можете пометить свой собственный ответ как принятый, нажав на флажок в левом верхнем углу рядом с ответом.

Похожие вопросы