php如何把pdf转图片,如何利用PHP将PDF转为图片以及拼接图片(附代码)

本文介绍了如何使用PHP结合ImageMagick扩展将PDF转换为PNG图片,并提供了处理多页PDF的代码示例。文章强调了在PHP 5+和7+版本中关于路径的注意事项,需要使用绝对路径。此外,还展示了如何通过拼接图片来处理多页PDF,以适应iOS预览需求。最后,给出了调用代码示例。
摘要由CSDN通过智能技术生成

对于如何利用PHP将PDF转为图片,其中最主要的是需要在服务器端安装ImageMagick扩展。有了ImageMagick扩展后,就可以使用下面的代码进行实现。

* @param $pdf 待处理的PDF文件

* @param $path 待保存的图片路径

* @param int|待导出的页面 $page 待导出的页面 -1为全部 0为第一页 1为第二页

* @return 保存好的图片路径和文件名 注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说, php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。

注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说, php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。

具体如何利用PHP将PDF转为图片请看如下具体实例代码:<?php

/**

* Created by PhpStorm.

* User: Administrator

* Date Time: 2018/7/16 16:13

* Author: Wanzhou Chen

* Email: 295124540@qq.com

*/

namespace utils;

class Handler

{

/**

* PDF2PNG

* @param $pdf 待处理的PDF文件

* @param $path 待保存的图片路径

* @param int|待导出的页面 $page 待导出的页面 -1为全部 0为第一页 1为第二页

* @return 保存好的图片路径和文件名 注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说, php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。

* 注:此处为坑 对于Imagick中的$pdf路径 和$path路径来说, php版本为5+ 可以使用相对路径。php7+版本必须使用绝对路径。所以,建议大伙使用绝对路径。

*/

static function pdfToPng($pdf,$path,$page=-1)

{

if(!extension_loaded('imagick'))

{

return 1;

}

if(!file_exists($pdf))

{

return 2;

}

if(!is_readable($pdf))

{

return 3;

}

$im = new \Imagick();

$im->setResolution(150,150);

$im->setCompressionQuality(100);

if($page==-1){

$im->readImage($pdf);

} else{

$im->readImage($pdf."[".$page."]");

}

foreach ($im as $Key => $Var)

{

$Var->setImageFormat('png');

$filename = $path. md5($Key.time()).'.png';

if($Var->writeImage($filename) == true)

{

$Return[] = $filename;

}

}

//返回转化图片数组,由于pdf可能多页,此处返回二维数组。

return $Return;

}

/**

* spliceimg

* @param array $imgs pdf转化png 路径

* @param string $img_path

* @return string 将多个图片拼接为成图的路径

* 注:多页的pdf转化为图片后拼接方法

* @internal param string $path 待保存的图片路径

*/

static function spliceImg($imgs = array(),$img_path = '')

{

$width = 500; //自定义宽度

$height = null;

$pic_tall = 0;//获取总高度

foreach ($imgs as $key => $value) {

$arr = getimagesize($value);

$height = $width/$arr[0]*$arr[1];

$pic_tall += $height;

}

$pic_tall = intval($pic_tall);

// 创建长图

$targetImg = imagecreatetruecolor($width,$pic_tall);

//分配一个白色底色

$color = imagecolorAllocate($targetImg,255,255,255);

imagefill($targetImg,0,0,$color);

$tmp = 0;

$tmpy = 0; //图片之间的间距

$src = null;

$size = null;

foreach ($imgs as $k => $v) {

$src = Imagecreatefrompng($v);

$size = getimagesize($v);

//5.进行缩放

imagecopyresampled($targetImg,$src, $tmp, $tmpy,0,0,$width,$height,$size[0],$size[1]);

//imagecopy($targetImg, $src, $tmp, $tmpy, 0, 0, $size[0],$size[1]);

$tmpy = $tmpy + $height;

//释放资源内存

imagedestroy($src);

unlink($imgs[$k]);

}

$returnfile = $img_path.date('Y-m-d');

if (!file_exists($returnfile))

{

if (!self::makeDir($returnfile))

{

/* 创建目录失败 */

return false;

}

}

$return_imgpath = $returnfile.'/'.md5(time().$pic_tall.'pdftopng').'.png';

imagepng($targetImg,$return_imgpath);

return $return_imgpath;

}

/**

* makeDir

* @param string $folder 生成目录地址

* 注:生成目录方法

* @return bool

*/

static function makeDir($folder)

{

$reval = false;

if (!file_exists($folder))

{

/* 如果目录不存在则尝试创建该目录 */

@umask(0);

/* 将目录路径拆分成数组 */

preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);

/* 如果第一个字符为/则当作物理路径处理 */

$base = ($atmp[0][0] == '/') ? '/' : '';

/* 遍历包含路径信息的数组 */

foreach ($atmp[1] AS $val)

{

if ('' != $val)

{

$base .= $val;

if ('..' == $val || '.' == $val)

{

/* 如果目录为.或者..则直接补/继续下一个循环 */

$base .= '/';

continue;

}

}

else

{

continue;

}

$base .= '/';

if (!file_exists($base))

{

/* 尝试创建目录,如果创建失败则继续循环 */

if (@mkdir(rtrim($base, '/'), 0777))

{

@chmod($base, 0777);

$reval = true;

}

}

}

}

else

{

/* 路径已经存在。返回该路径是不是一个目录 */

$reval = is_dir($folder);

}

clearstatcache();

return $reval;

}

}

调用语句把pdf转成png,并拼接图片:把pdf转成png,并拼接图片(兼容ios预览无法显示签章问题)// 把pdf转成png,并拼接图片(兼容ios预览无法显示签章问题)

$imgArr = Handler::pdfToPng($path,$_SERVER['DOCUMENT_ROOT'].'/file/');

$img = '';

if($imgArr&&is_array($imgArr)){

$img = Handler::spliceImg($imgArr,$_SERVER['DOCUMENT_ROOT'].'/file/agreement/');

}

相关推荐:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值