如何使用PHP Imagick库将图片转为PDF时指定8.5×11英寸纵向页面
将图片转换为8.5×11英寸纵向PDF的PHP Imagick解决方案
要让图片适配8.5×11英寸(Letter规格)的纵向PDF页面,你需要手动创建对应尺寸的画布,将图片按比例缩放后居中放置,再输出PDF。默认情况下Imagick会直接沿用图片的尺寸作为PDF页面大小,因此需要额外处理页面布局。
修改后的代码:
$source_image = '你的图片路径'; $destination_pdf = '输出PDF路径'; // 定义Letter页面的像素尺寸(基于72DPI,PDF标准分辨率) $letterWidth = 8.5 * 72; // 612像素 $letterHeight = 11 * 72; // 792像素 $imagick = new Imagick(); // 读取原图,改用'r'只读模式更合理 $source_handle = fopen($source_image, 'r'); $imagick->readImageFile($source_handle); fclose($source_handle); // 创建新的Letter尺寸画布,白色背景 $canvas = new Imagick(); $canvas->newImage($letterWidth, $letterHeight, 'white', 'pdf'); // 计算图片缩放比例,保持宽高比且不超出画布 $imageWidth = $imagick->getImageWidth(); $imageHeight = $imagick->getImageHeight(); $scale = min($letterWidth / $imageWidth, $letterHeight / $imageHeight); // 按比例缩放图片 $imagick->scaleImage($imageWidth * $scale, $imageHeight * $scale); // 计算图片在画布中的居中位置 $x = ($letterWidth - $imagick->getImageWidth()) / 2; $y = ($letterHeight - $imagick->getImageHeight()) / 2; // 将缩放后的图片合成到画布上 $canvas->compositeImage($imagick, Imagick::COMPOSITE_OVER, $x, $y); // 写入并输出PDF文件 $output_handle = fopen($destination_pdf, 'w'); $canvas->writeImageFile($output_handle); fclose($output_handle); // 清理Imagick资源,避免内存泄漏 $imagick->destroy(); $canvas->destroy();
关键说明:
- 页面尺寸转换:以PDF行业标准的72DPI为基准,将8.5×11英寸转换为612×792像素的画布;如果需要更高分辨率(如300DPI),可将72替换为300,对应像素尺寸为2550×3300。
- 缩放逻辑:通过
min()计算最大适配比例,确保图片完整显示且不超出页面边界。 - 居中布局:通过画布与图片的尺寸差计算偏移量,实现图片在页面内的居中效果。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

