如何使用Perl

时间:2017-10-26 21:17:42

标签: perl pdf pdf-generation

我想要实现的是将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节点,但发现没有办法用我需要的值更新节点。

如果您认为这种方法可行,我将非常感谢您展示如何有效拉取特定节点并更改其值的示例。

当然,除了任何这些方法之外,任何其他想法如何实现目标也是非常受欢迎的。非常感谢!

0 个答案:

没有答案