PHP, 將 PDF/Word/PPT 文檔轉換成圖片生成長圖

先將 office 文檔轉成 PDF

  1. 通過 Java 調用 openoffice
  2. 在 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();

注意事項

  1. 轉換圖片需要用到 Imagick

  2. imagick 讀取 PDF 文件需要用到 ghostscript

    • 下載地址
    • 將 ghostscript 添加到 path
    • 也可以直接二進制包安裝, 如 yum install ghostscript
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章