使用Perl的PDF :: API2操作具有不同旋转和缩放的PDF文件

时间:2014-08-27 10:16:03

标签: perl pdf perl-module

我使用CAM::PDF合并多个PDF文件。这很好用。现在我需要使用PDF::API2在每个页面上添加一个标记。这适用于某些页面,但不适用于其他页面。

使用wkhtmltopdf创建的PDF文件似乎翻转了他们的协调系统,并且缩放也已关闭。

在浏览页面时,我添加了一个这样的标记:

my $pdf2       = PDF::API2->open_scalar($pdf_data);
my $page_count = $pdf2->pages;
for my $i ( 1 .. $page_count ) {
    my $page    = $pdf2->openpage($i);
    my $content = $page->gfx();
    my $text    = $page->text();
    $content->linewidth(2);
    $content->rectxy( 5, 10, 140, 40 );
    $content->stroke;
    my $font = $pdf2->ttfont('calibri.ttf');
    $text->scale( 1.0, 1.0 );
    $text->font( $font, 12 );
    $text->translate( 10, 14 );
    $text->text( sprintf( 'PAGINA %d VAN %d', $i, $page_count ) );
    $text->translate( 10, 26 );
    $text->text('some ID');
}
my $pdf_data = $pdf2->stringify;

现在,来自wkhtmltopdf的页面有一个小盒子,左上角有一个更小的文本(但在页面边距内)并且它被镜像了。非wkhtmltopdf页面有一个正确大小的框,左下角有正确大小的文本(忽略页边距)。

使用$content->scale$content->rotate(180)我可以在wkhtmltopdf创建的页面上正确显示标记。但其他页面搞砸了。

那么,有没有办法确保每个文档在所有页面上具有相同的方向,旋转和缩放?

2 个答案:

答案 0 :(得分:2)

++ Htbaa已经回答如何解决这个问题。

我有机会看看wkhtmltopdf。这个答案描述了为什么输出会导致问题。

我写了一篇琐碎的/tmp/hw.html

<html>
    <body>hello world!</body>
</html>

然后创建并解压缩pdf:

% wkhtmltopdf --version
Name:
  wkhtmltopdf 0.9.9
  ...
% xvfb-run wkhtmltopdf /tmp/hw.html /tmp/hw.pdf
% pdftk /tmp/hw.pdf output /tmp/hw1.pdf uncompress

这是页面内容(对象8)的样子。

8 0 obj <</Length 751>>stream /GSa gs /CSp cs /CSp CS 0.060000000 0 0
-0.060000000 28.3200000 813.679999 cm q q Q Q q q Q q /CSp cs 0 0 0
scn /GSa gs Q Q q 0 0 m 8963.99983 0 l 8963.99983 345.507488 l 0
345.507488 l 0 0 l h W* n q /CSp cs 0 0 0 scn /GSa gs /CSp cs 1 1 1
scn /GSa gs q 9.59743022 0 0 9.59743022 0 0 cm 0 0 934 36 re f Q Q q
9.59743022 0 0 9.59743022 0 0 cm /CSp cs 0 0 0 scn /GSa gs 0 0 0 SCN 0
w 2 J 2 j [] 0 d q /CSp cs 0 0 0 scn /GSa gs BT /F7 16 Tf 1 0 0 -1 0 0
Tm 8 -24 Td <0001> Tj 9 0 Td <0002> Tj 9 0 Td <0003> Tj 4 0 Td <0003>
Tj 4 0 Td <0004> Tj 9 0 Td <0005> Tj 4 0 Td <0006> Tj 12 0 Td <0004>
Tj 9 0 Td <0007> Tj 5 0 Td <0003> Tj 4 0 Td <0008> Tj 9 0 Td <0009> Tj
ET Q Q Q q q 12 0 0 12 0 0 cm /CSp cs 0 0 0 scn /GSa gs 0 0 0 SCN 0 w
2 J 2 j [] 0 d Q Q

endstream endobj

答案是在页面上的第一条指令/GSa gs设置图形状态,发生在第一条q指令之前(保存图形状态)。

因此页面处于不整洁的图形状态。当进一步的内容随后被PDF :: API2添加到PDF时,它正在使用已更改的状态。

答案 1 :(得分:1)

@snoopy指出的answer似乎解决了我遇到的问题。 stamp-pdf / overlay-pdf的文本和图像大小在所有页面上都是相同的大小。