如何使用PDF::API2获取页面尺寸(A4等)及页面方向?
使用PDF::API2获取PDF页面尺寸与方向的方法
当然可以用PDF::API2获取这些信息!其实它提供了对应的底层方法,只需要结合一点简单计算就能转换成你需要的直观结果。下面是具体的实现思路和代码示例:
获取页面原始尺寸
PDF的页面物理尺寸由MediaBox定义,PDF::API2的页面对象提供了get_mediabox()方法,返回四个坐标值:(x1, y1, x2, y2),分别对应页面左下角和右上角的坐标。通过计算x2 - x1和y2 - y1就能得到页面的宽度和高度(单位为点(pt),1点=1/72英寸)。
判断页面方向
页面方向需要结合两个关键因素:
- 原始宽高的大小对比
- 页面的旋转角度(通过
get_rotate()方法获取,返回值为0、90、180、270中的一个)
如果页面旋转了90或270度,实际显示的宽高会和原始宽高交换,所以需要先根据旋转角度调整后再判断方向:
- 调整后宽度 > 高度 → 横向(Landscape)
- 调整后宽度 ≤ 高度 → 纵向(Portrait)
匹配标准纸张规格
你可以将计算出的原始宽高和常见标准尺寸的点值对比(允许1点以内的误差,因为部分PDF可能存在细微的尺寸调整):
- A4:595×842点
- US Letter:612×792点
- A3:842×1190点
完整代码示例
use PDF::API2; # 打开目标PDF文件 my $pdf = PDF::API2->open('your_document.pdf'); # 遍历所有页面 foreach my $page_num (1 .. $pdf->pages()) { my $page = $pdf->openpage($page_num); # 获取MediaBox坐标,计算原始宽高 my ($x1, $y1, $x2, $y2) = $page->get_mediabox(); my $raw_width = $x2 - $x1; my $raw_height = $y2 - $y1; # 获取页面旋转角度 my $rotate = $page->get_rotate(); # 根据旋转角度计算实际显示的宽高 my ($display_width, $display_height); if ($rotate == 90 || $rotate == 270) { ($display_width, $display_height) = ($raw_height, $raw_width); } else { ($display_width, $display_height) = ($raw_width, $raw_height); } # 判断页面方向 my $orientation = $display_width > $display_height ? '横向(Landscape)' : '纵向(Portrait)'; # 匹配标准纸张尺寸 my $paper_size; my $tolerance = 1; # 允许1点的误差 if (abs($raw_width - 595) < $tolerance && abs($raw_height - 842) < $tolerance) { $paper_size = 'A4'; } elsif (abs($raw_width - 612) < $tolerance && abs($raw_height - 792) < $tolerance) { $paper_size = 'US Letter'; } elsif (abs($raw_width - 842) < $tolerance && abs($raw_height - 1190) < $tolerance) { $paper_size = 'A3'; } else { $paper_size = "自定义(${raw_width}×${raw_height}点)"; } # 输出结果 print "页面 $page_num 信息:\n"; print " 原始尺寸:${raw_width}×${raw_height}点\n"; print " 旋转角度:$rotate 度\n"; print " 显示尺寸:${display_width}×${display_height}点\n"; print " 页面方向:$orientation\n"; print " 纸张规格:$paper_size\n\n"; }
额外说明
- 如果需要将点转换为毫米或英寸,可以用以下换算:
- 1点 = 1/72 英寸 ≈ 0.352778 毫米
- 1英寸 = 25.4 毫米 = 72 点
- 部分PDF可能使用CropBox(裁剪框)定义实际显示区域,如果需要获取裁剪后的尺寸,可以用
get_cropbox()方法替代get_mediabox()。
内容的提问来源于stack exchange,提问作者DavidA
相关产品推荐
相关产品推荐

