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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章