操纵不同的旋转而产生的PDF文件,并与Perl的PDF缩放:: API2(Manipulating

2019-10-20 19:39发布

我使用的是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创建的页面的邮票。 但随后的其他页面都搞砸了。

那么,有没有什么办法,以确保每个文件具有相同的方向,旋转和缩放的所有网页上?

Answer 1:

++ 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,它使用的是改变状态。



Answer 2:

在回答中指出@snoopy似乎解决我遇到的问题。 印章PDF /叠加PDF格式的文本和图像大小在所有页面大小相同。



文章来源: Manipulating a PDF file with different rotations and scaling with Perl's PDF::API2