Я начну с того, что могу с успехом создавать PDF-файлы с помощью mPDF, но я не могу объединить существующий PDF-файл с только что сгенерированным PDF-файлом.
Что мне нужно выяснить, так это как добавить / добавить существующий PDF-файл во вновь созданный PDF-файл. Я пытался использовать методы mPDF для импорта страниц, но все, что я могу получить, это ошибка вроде:
mPDF error: Cannot open '/downloads/test.pdf'.
Приведенное выше сообщение является неоднозначным и неясным, ПОЧЕМУ он не может открыть файл …
Вот код, который я использую для объединения PDF-файлов:
include_once("./pdf/mpdf/mpdf.php");
$output_file = $_GET['output_file'];
$url = $_GET['input_file'];
$technical_drawing = $_GET['tech_drawing'];
$html = file_get_contents($url);
$mpdf = new mPDF('utf-8','Letter','','',0,0,0,0,0,0,'P');
$mpdf->SetImportUse();
$pagecount = $mpdf->SetSourceFile($technical_drawing);
$tplIdx = $mpdf->ImportPage($pagecount);
$mpdf->UseTemplate($tplIdx);
$mpdf->WriteHTML($html);
$mpdf->Output($output_file, 'D');
exit;
$ output_file будет именем файла, показанным пользователю.
$ url — это HTML-код, который мы записываем в файл при генерации PDF.
$ technical_drawing — это относительный путь к PDF, который мы хотим добавить / объединить с созданным PDF.
Я понимаю, что могу использовать что-то вроде ghostscript, но у меня нет доступа такого типа на сервере клиента.
Дайте мне знать, если кто-нибудь нашел решение этой проблемы с помощью mPDF или я являюсь S.O.L. и нужно найти другую библиотеку для слияния PDF. Я действительно ищу решения или предложения, а не просто ссылки на другую библиотеку. Я исчерпал то, что я могу найти в Google или в документации mPDF, описывающей мою ошибку.
EDIT: изменена ошибка mPDF с http://example.com/pdf/example.pdf в /downloads/test.pdf.
EDIT_2: код был исправлен, чтобы принять относительный путь.
Вот последний рабочий код. Бонус, если кто-то знает, как указать порядок записи HTML в документ PDF, импортируя страницу как последнюю страницу (с нестандартным размером страницы, отличным от размера HTML).
include_once("./pdf/mpdf/mpdf.php");
$output_file = 'test-' . $_GET['output_file'];
$url = $_GET['input_file'];
$technical_drawing = $_GET['tech_drawing'];
$html = file_get_contents($url);if(!file_exists($technical_drawing)) {
$mpdf = new mPDF('utf-8','Letter','','',0,0,0,0,0,0,'L');
} else {
$mpdf = new mPDF('utf-8','A3-L','','',0,0,0,0,0,0,'L');
$mpdf->SetImportUse();
$pagecount = $mpdf->SetSourceFile($technical_drawing);
$import_page = $mpdf->ImportPage();
$mpdf->UseTemplate($import_page);
// Add Last page
$mpdf->AddPageByArray(array(
'orientation' => 'P',
'ohvalue' => 1,
'ehvalue' => -1,
'ofvalue' => -1,
'efvalue' => -1,
'newformat' => 'Letter'
));
}
$mpdf->WriteHTML($html);
$mpdf->Output($output_file, 'D');
exit;
Я объединяю PDF-файлы, как это — {все страницы во всех файлах}:
$ this = класс, расширяющий класс mPDF …
function mergePDFFiles(Array $filenames, $outFile)
{
if ($filenames) {
$filesTotal = sizeof($filenames);
$fileNumber = 1;
$this->SetImportUse();
if (!file_exists($outFile)) {
$handle = fopen($outFile, 'w');
fclose($handle);
}
foreach ($filenames as $fileName) {
if (file_exists($fileName)) {
$pagesInFile = $this->SetSourceFile($fileName);
for ($i = 1; $i <= $pagesInFile; $i++) {
$tplId = $this->ImportPage($i);
$this->UseTemplate($tplId);
if (($fileNumber < $filesTotal) || ($i != $pagesInFile)) {
$this->WriteHTML('<pagebreak />');
}
}
}
$fileNumber++;
}
$this->Output($outFile);
}
}
function mergePDFFiles(Array $filenames, $outFile) {
$mpdf = new mPDF();
if ($filenames) {
// print_r($filenames); die;
$filesTotal = sizeof($filenames);
$fileNumber = 1;
$mpdf->SetImportUse();
if (!file_exists($outFile)) {
$handle = fopen($outFile, 'w');
fclose($handle);
}
foreach ($filenames as $fileName) {
if (file_exists($fileName)) {
$pagesInFile = $mpdf->SetSourceFile($fileName);
//print_r($fileName); die;
for ($i = 1; $i <= $pagesInFile; $i++) {
$tplId = $mpdf->ImportPage($i);
$mpdf->UseTemplate($tplId);
if (($fileNumber < $filesTotal) || ($i != $pagesInFile)) {
$mpdf->WriteHTML('<pagebreak />');
}
}
}
$fileNumber++;
}
$mpdf->Output($outFile, 'D');
}
}
Это старый вопрос. Я попал сюда после того, как застрял, объединяя мои PDF-файлы в один и показывая его в браузере. Два ответа выше были проверены мной и не сработали, как ожидалось. Первая страница первого файла была показана правильно, первая страница второго файла перепрыгнула пустую страницу и обрезана, то есть показала только N-1 из N страниц. Последняя страница отсутствовала.
Вот обходной путь, который я сделал после сканирования в исходный код mpdf.php:
function mergePDFFiles(Array $filenames, $outFile, $title='', $author = '', $subject = '') {
$mpdf=new mPDF('c');
$mpdf->SetTitle($title);
$mpdf->SetAuthor($author);
$mpdf->SetSubject($subject);
if ($filenames) {
$filesTotal = sizeof($filenames);
$mpdf->SetImportUse();
for ($i = 0; $i<count($filenames);$i++) {
$curFile = $filenames[$i];
if (file_exists($curFile)){
$pageCount = $mpdf->SetSourceFile($curFile);
for ($p = 1; $p <= $pageCount; $p++) {
$tplId = $mpdf->ImportPage($p);
$wh = $mpdf->getTemplateSize($tplId);
if (($p==1)){
$mpdf->state = 0;
$mpdf->UseTemplate ($tplId);
}
else {
$mpdf->state = 1;
$mpdf->AddPage($wh['w']>$wh['h']?'L':'P');
$mpdf->UseTemplate($tplId);
}
}
}
}
}
$mpdf->Output();
unset($mpdf);
}
$outFile
не используется, поскольку полученный PDF-файл предназначен для принудительного использования браузером.