先將 office 文檔轉成 PDF
- 通過 Java 調用 openoffice
- openoffice 安裝與報錯解決
- 實際使用時, 在 windows 上沒大問題, 在 centos(Linux) 時腳本執行異常地慢
- 在 Linux 上改用 libreoffice, 使用 PHP 的 exec 調用命令行運行
將 PDF 轉成圖片 (代碼)
由於 PDF 多頁的情況下會生成多圖, 下面代碼還會將生成的多張圖片合成長圖
function main() {
// 如果將代碼放在 web 服務中則可能需要用到以下兩行
// 可在 php.ini 修改具體的值
ini_set('max_execution_time', '0'); // 不限制處理時間
ini_set('memory_limit', '-1'); // 取消內存大小限制
$imgs = pdf2jpg('./new.pdf', '.');
$all_size = pic_max_size($imgs); // 返回底圖的寬和高
$base_pic = create_base_pic($all_size[0], $all_size[1], '.'); // 生成底圖
$bigimage = create_bigimage($imgs, $base_pic, '.'); // 拼接成長圖
// 清理轉化過程的中間文件
foreach ($imgs as $val) {
unlink($val);
}
unlink($base_pic);
}
// $imgs array 小圖數組, $target string 長圖底圖
function create_bigimage($imgs, $target, $dirpath) {
$target_img = Imagecreatefromjpeg($target);
$source = array();
foreach ($imgs as $k => $v) {
$source[$k]['source'] = Imagecreatefromjpeg($v);
$source[$k]['size'] = getimagesize($v);
}
$tmpx = 0;
$tmpy = 0; //圖片之間的間距
for ($i = 0; $i < count($imgs); $i++) {
imagecopy($target_img, $source[$i]['source'], $tmpx, $tmpy, 0, 0, $source[$i]['size'][0], $source[$i]['size'][1]);
$tmpy = $tmpy + $source[$i]['size'][1];
}
$filename = $dirpath . '/' . substr(md5(uniqid(rand())), 0, 15) . '.jpg';
Imagejpeg($target_img, $filename);
imagedestroy($target_img);
return $filename;
}
function create_base_pic($width, $height, $dirpath) {
$filename = substr(md5(uniqid(rand())), 0, 15). '.jpg';
$filepath = $dirpath . $filename;
if (!is_dir($dirpath)) {
mkdir($dirpath);
};
$im =imagecreate($width, $height);
ImageColorAllocate ($im, 25, 255, 255);
imagejpeg($im, $filepath, 0);
imagedestroy($im);
return $filepath;
}
function pic_max_size($arr) {
list($width, $height, $type, $attr) = getimagesize($arr[0]);
$height = $height * count($arr);
return [$width, $height];
}
// 將 PDF 轉成圖片
function pdf2jpg($pdf, $dirpath) {
if (!extension_loaded('imagick')) {
return false;
}
if (!file_exists($pdf)) {
return false;
}
$im = new imagick();
$im->setResolution(320, 320);
$im->setCompressionQuality(100);
$im->readImage($pdf);
foreach ($im as $key => $var) {
$var->setImageFormat('jpg');
$filename = $dirpath . '/' . md5($key.time()) . '.jpg';
if ($var->writeImage($filename) == true) {
$return[] = $filename;
}
}
return $return;
}
main();
注意事項
-
轉換圖片需要用到 Imagick
- Ubuntu 安裝 Imagick
- 添加讀取 PDF 文件的權限
-
imagick 讀取 PDF 文件需要用到 ghostscript
- 下載地址
- 將 ghostscript 添加到 path
- 也可以直接二進制包安裝, 如
yum install ghostscript