小智 8
试试:
如果某些现有的 PDF 工具尚未执行此功能,那么这里是我将如何使用CAM::PDF解决该问题的高级头脑风暴。我不确定它是否有效。
我不知道额外的超出裁剪框的内容是否会不可见,或者是否会影响渲染......
更新:我实现了一个大部分有效、简单的解决方案,如下所示。它复制相关页面,旋转两个副本,并在每个副本上设置 CropBox,选择第一页的左半部分和第二页的右半部分。不确定,您的情况可能不需要轮换。
#!/usr/bin/perl
use strict;
use warnings;
use CAM::PDF;
my $pdffile = 't/sample1.pdf';
my $pdfout = 'temp2.pdf';
my $pagenum = 1;
my $pdf = CAM::PDF->new($pdffile) or die $CAM::PDF::errstr;
my ($objnum, $gennum) = $pdf->getPageObjnum($pagenum);
my $pagedict = $pdf->getPage($pagenum);
$pagedict->{Rotate} = CAM::PDF::Node->new('number', 90);
my $oldbox = $pdf->getValue($pagedict->{CropBox} || $pagedict->{MediaBox});
my @box = map {$pdf->getValue($_)} @{$oldbox};
$pagedict->{CropBox} = CAM::PDF::Node->new('array', [
map {CAM::PDF::Node->new('number', $_)} $box[0], $box[1], $box[2], ($box[3]+$box[1])/2
]);
my $duplicate = CAM::PDF->new($pdffile) or die $CAM::PDF::errstr;
$duplicate->extractPages($pagenum);
$pdf->appendPDF($duplicate); # appends at end instead of inserting
$pagedict = $pdf->getPage($pdf->numPages());
$pagedict->{Rotate} = CAM::PDF::Node->new('number', 90);
$pagedict->{CropBox} = CAM::PDF::Node->new('array', [
map {CAM::PDF::Node->new('number', $_)} $box[0], ($box[3]+$box[1])/2, $box[2], $box[3]
]);
if ($objnum) {
$pdf->{changes}->{$objnum} = 1;
}
$pdf->cleanoutput($pdfout);
Run Code Online (Sandbox Code Playgroud)