我想要实现的是将TrimBox添加到许多现有的PDF文档中。我想用Perl来完成这项任务。
我已经研究并尝试了许多方法,但没有成功。我很高兴为进一步推动这些方法提出建议:
1)PDF :: API2
这个开始看起来很有希望,我设法用这样的方法以编程方式添加TrimBoxes:
#!/usr/bin/perl
use warnings;
use strict;
use PDF::API2;
my $pdfsource = "test.pdf";
my $pdftarget = "output.pdf"
my $pdf = PDF::API2->open($pdfsource);
my $page = $pdf->openpage(1);
$page->trimbox(255, 9, 1042, 536);
$pdf->saveas($pdftarget);
此代码适用于相当多的PDF,但不幸的是,它会破坏大约。约25%的PDF文件。当尝试在Acrobat阅读器中打开输出文件时,我得到“此页面上存在错误.Acrobat可能无法正确显示页面。”
如果我只是使用PDF :: API2打开并保存PDF而不做任何修改,就会出现同样的问题:
#!/usr/bin/perl
use warnings;
use strict;
use PDF::API2;
my $pdfsource = "test.pdf";
my $pdftarget = "output.pdf"
my $pdf = PDF::API2->open($pdfsource);
$pdf->saveas($pdftarget);
任何提示如何避免或进一步诊断PDF :: API2的这种行为,仅影响某些PDF,将非常受欢迎,因为这个库最方便使用。
2)直接在原始级别更改文件
我的下一个想法是:我想要更改PDF中只有一个现有对象的值。可能PDF :: API2做了太多而且重写了整个文件,这打破了它。那么为什么不尽可能地保持我的访问权限,只需在Perl中逐行读取文件并替换我想要更改的特定值?
这是我为此写的脏代码(请不要笑):
#!/usr/bin/perl
use warnings;
use strict;
my $pdfsource = "test.pdf";
my $pdftarget = "output.pdf";
open my $fh, '<', $pdfsource or die;
binmode($fh);
open my $fho, '>', $pdftarget or die;
binmode($fho);
my $line = undef;
while(<$fh>) {
if ($_ =~ /\/TrimBox/) {
$line = $_;
my $index = index($line, "/TrimBox");
my @parts = split /\/TrimBox/, $line;
$parts[0] = $parts[0] . "/Trimbox";
$parts[1] =~ s/0 0 1296 864/255 9 1042 536/;
$line = $parts[0] . $parts[1];
print $fho $line;
} else {
print $fho $_;
}
}
close $fh;
close $fho;
不幸的是,这种方法会破坏所有输出文件 - 所以要么代码中存在错误,要么PDF以某种方式受到校验和保护,不受此类更改的影响。
3)CAM :: PDF
然后我研究了CAM :: PDF,因为我正在寻找一个操作PDF中特定对象的选项,而不必在原始级别上工作。不幸的是,这个模型没有太深入的记录,为什么我只能从我的PDF文件中读取现有的TrimBox节点,但发现没有办法用我需要的值更新节点。
如果您认为这种方法可行,我将非常感谢您展示如何有效拉取特定节点并更改其值的示例。
当然,除了任何这些方法之外,任何其他想法如何实现目标也是非常受欢迎的。非常感谢!