2014-08-27 21 views
1

我使用CAM::PDF来合并几个PDF文件。这工作正常。现在我需要在每个页面上使用PDF::API2添加一个印章。这对一些页面工作正常,但不适用于其他页面。使用Perl的PDF :: API2处理具有不同旋转和缩放的PDF文件

用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创建的页面上正确显示标记。但其他网页却搞砸了。

那么,有什么方法可以确保每个文档在所有页面上的方向,旋转和缩放都相同吗?

+0

一个奇怪的现象是,当我用wkhtmltopdf设置70的DPI时,邮票的大小似乎相匹配。文本和坐标似乎仍然是镜像的。 – Htbaa 2014-08-27 15:03:18

+0

另外,当我不使用'CAM :: PDF'时,只需将由wkhtmltopdf生成的单个PDF文档直接传递到'PDF :: API2',就会出现同样的问题。 – Htbaa 2014-08-27 15:48:24

+1

请参阅[这个答案](http://stackoverflow.com/questions/2947925/how-to-add-header-footer-with-images-using-pdfapi2lite/3049803#3049803)通过使用importPageIntoForm方法解决此问题然后叠加新的文字和图形。 – dwarring 2014-08-28 02:15:29

回答

1

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

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中时,它将使用已更改的状态。

+0

我之所以深入研究这个问题,是因为我正在为Perl 6编写一些PDF实用程序 - https://github.com/p6-pdf/perl6-PDF-Tools。似乎有一项工作要在'q''' Q'包裹身体之前追加。 – dwarring 2015-03-16 00:11:21

相关问题