我首先要说的是,我可以使用mPDF生成PDF文件,但就我而言,我无法将现有的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是我们在PDF生成期间写入文件的HTML。 $ technical_drawing是我们想要附加/合并生成的PDF的PDF的相对路径。
我知道我可以使用像ghostscript这样的东西,但我在客户端的服务器上没有这种访问权限。
让我知道是否有人使用mPDF找到了解决方案,或者我是否是S.O.L.并需要找到另一个库来进行PDF合并。我真的在寻找解决方案或建议,但不只是寻找其他图书馆的链接。我已经厌倦了我在Google或mPDF的文档中找到的内容,这些文档描述了我所遇到的错误。
编辑:将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;
答案 0 :(得分:3)
我像这样合并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);
}
}
答案 1 :(得分:1)
此代码适用于mpdf 8.0.7和php 7.4。
List<Contact> tempContactList = List<Contact>();
contactList.forEach((contact) {
if (contact.displayName != null){
var searchName = val.replaceAll(new RegExp(r'[\u200f]'), "");
if(contact.displayName.contains(searchName)){
tempContactList.add(contact);
}
}
});
答案 2 :(得分:0)
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');
}
}
答案 3 :(得分:0)
这是一个老问题。在我将PDF合并为一个并在浏览器中显示之后,我登陆了这里。上面的两个答案由我测试,并没有按预期工作。第一个文件的第一页被正确显示,第二个文件的第一页跳过一个空白页,并被截获,即只显示N页的N-1页。最后一页丢失了。 这是我在抓取到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旨在强制浏览器。