PHP缩小或转换PDF以进行实时预览
问题PHP缩小或转换PDF以进行实时预览,php,pdf,tcpdf,imagick,fpdi,Php,Pdf,Tcpdf,Imagick,Fpdi,问题 目前正在使用PDFI+TCPDF在Laravel PHP中创建实时PDF生成预览,以便用户可以导入基本PDF并在其上嵌入文本 PDF生成适用于所有大小,但大型PDF(例如A1大小)生成的10+MB文件太大,无法返回前端进行预览 寻找最快和最好的方法来优化和减少PDF文件大小,或调整实际PDF尺寸,以提供仅用于预览的缩小版本 TLDR 通过调整大小或转换为原始大PDF的图像文件,寻找建议(我在下面尝试过的建议除外),或改进我尝试创建PDF预览文件的内容 我到目前为止所做的尝试 I
- 目前正在使用PDFI+TCPDF在Laravel PHP中创建实时PDF生成预览,以便用户可以导入基本PDF并在其上嵌入文本
- PDF生成适用于所有大小,但大型PDF(例如A1大小)生成的10+MB文件太大,无法返回前端进行预览
- 寻找最快和最好的方法来优化和减少PDF文件大小,或调整实际PDF尺寸,以提供仅用于预览的缩小版本
TLDR
通过调整大小或转换为原始大PDF的图像文件,寻找建议(我在下面尝试过的建议除外),或改进我尝试创建PDF预览文件的内容
我到目前为止所做的尝试
Imagick PDF到图像转换-输出大小良好(31mb>700kb),但速度较慢(1秒>10秒)
在使用图像创建缩小的PDF之前,使用Imagick将PDF转换为图像是我最初的想法,但是我发现Imagick读取PDF blob图像的速度非常慢(与生成PDF本身的时间不到1秒相比,大约需要9秒)。代码如下
// $output === the PDF generated
$downscaleSizeFactor = $this->jsonFile->canvas['downscale_size_factor'] ?? 1;
$previewWidth = $this->size['width'] / $downscaleSizeFactor;
$previewHeight = $this->size['height'] / $downscaleSizeFactor;
$im = new Imagick;
$im->readImageBlob($output); // SLOW HERE!!!
$numPages = $im->getNumberImages();
$pdfPreview = new TCPDF($this->size["orientation"], 'mm', [$previewWidth, $previewHeight], true, 'UTF-8', false);
$pdfPreview->setPrintHeader(false);
$pdfPreview->setPrintFooter(false);
$pdfPreview->SetAutoPageBreak(false, 0);
for($i=0;$i<$numPages;$i++) {
$im->setIteratorIndex($i);
$selectedIm = $im->getImage();
$selectedIm->resizeImage($previewWidth, $previewHeight, imagick::FILTER_LANCZOS, 1, true);
$selectedIm->setImageBackgroundColor('white');
$selectedIm->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$selectedIm->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$selectedIm->setImageFormat('png');
$selectedIm->setImageCompressionQuality(100);
$imageString = $selectedIm->getImageBlob();
// add a page
$pdfPreview->AddPage();
// set JPEG quality
$pdfPreview->setJPEGQuality(100);
$pdfPreview->Image('@'.$imageString, 0, 0, $previewWidth, $previewHeight);
}
$im->clear();
$im->destroy();
return $pdfPreview->output('', 'S');
$reducedPdf = new FpdiTcpdfCustom();
$tempPdfFile = storage_path('app/templates/pdf/temp/'.$name.'');
$pageCount = $reducedPdf->setSourceFile($tempPdfFile);
$pageNo = 1;
for ($pageNo; $pageNo <= $pageCount; $pageNo++) {
// Checks if the page is to be skipped
// Import a page from the blank by setting the
$pageId = $reducedPdf->importPage($pageNo);
// Return the size of the imported page
$size = $reducedPdf->getTemplateSize($pageId);
// Remove default header/footer
$reducedPdf->setPrintHeader(false);
$reducedPdf->setPrintFooter(false);
$reducedPdf->SetAutoPageBreak(false, 0);
// Creates the PDF page
$reducedPdf->AddPage($size['orientation'], [10,10]);
$reducedPdf->useTemplate($pageId, 0, 0, 10, 10);
}
return $reducedPdf->output('', 'S');
建议?
有没有人对改进我的尝试或以其他方式实现我所需要的有什么建议
$tempPdf = new \Spatie\PdfToImage\Pdf(storage_path('app/templates/pdf/temp/'.$name));
$tempPdf->setCompressionQuality(10);
$tempPdf->saveImage(storage_path('app/templates/pdf/temp/'));