Ich hatte ein ähnliches Problem in meiner Software. Wir wollten mehrere PDF-Dateien zu einer PDF-Datei zusammenführen und an einen externen Dienst senden. Wir haben mit der FPDI Lösung wie in gezeigt Christa ‚s Lösung.
Die von uns verwendeten Eingabe-PDFs könnten jedoch eine höhere Version als 1.7 haben. Wir haben uns entschlossen, das kommerzielle FPDI-Add-On zu evaluieren. Es stellte sich jedoch heraus, dass einige der von unserem Bürokopierer gescannten Dokumente fehlerhafte Indizes aufwiesen, wodurch das kommerzielle FPDI-Add-On abstürzte. Deshalb haben wir uns entschieden, die Ghostscript- Lösung wie in Chauhans Antwort zu verwenden.
Aber dann haben wir einige seltsame Metadaten in den Ausgabe-PDF-Eigenschaften.
Schließlich haben wir uns entschlossen, zwei Lösungen zu verbinden, um PDFs von Ghostscript zusammenzuführen und herunterzustufen, aber die Metadaten werden von FPDI festgelegt. Wir wissen noch nicht, wie es mit einigen fortgeschrittenen formatierten PDFs funktionieren würde, aber für Scans, die wir verwenden, funktioniert es einwandfrei. Hier ist unser Klassenauszug:
class MergedPDF extends \FPDI
{
private $documentsPaths = array();
public function Render()
{
$outputFileName = tempnam(sys_get_temp_dir(), 'merged');
$cmd = "/usr/bin/gs -q -dNOPAUSE -dBATCH -dCompatibilityLevel=1.4 -sDEVICE=pdfwrite -sOutputFile=$outputFileName";
foreach ($this->getDocumentsPaths() as $pdfpath) {
$cmd .= " $pdfpath ";
}
$result = shell_exec($cmd);
$this->SetCreator('Your Software Name');
$this->setPrintHeader(false);
$numPages = $this->setSourceFile($outputFileName);
for ($i = 1; $i <= $numPages; $i++) {
$tplIdx = $this->importPage($i);
$this->AddPage();
$this->useTemplate($tplIdx);
}
unlink($outputFileName);
$content = $this->Output(null, 'S');
return $content;
}
public function getDocumentsPaths()
{
return $this->documentsPaths;
}
public function setDocumentsPaths($documentsPaths)
{
$this->documentsPaths = $documentsPaths;
}
public function addDocumentPath($documentPath)
{
$this->documentsPaths[] = $documentPath;
}
}
Die Verwendung dieser Klasse ist wie folgt:
$pdf = new MergedPDF();
$pdf->setTitle($pdfTitle);
$pdf->addDocumentPath($absolutePath1);
$pdf->addDocumentPath($absolutePath2);
$pdf->addDocumentPath($absolutePath3);
$tempFileName = tempnam(sys_get_temp_dir(), 'merged');
$content = $pdf->Render();
file_put_contents($tempFileName, $content);