【问题标题】:Manipulating a PDF file with different rotations and scaling with Perl's PDF::API2使用 Perl 的 PDF::API2 处理具有不同旋转和缩放的 PDF 文件
【发布时间】:2014-08-27 10:16:02
【问题描述】:

我正在使用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 创建的页面上正确显示印章。但是其他页面就乱了。

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

【问题讨论】:

  • 一个奇怪的观察是,当我使用 wkhtmltopdf 将 DPI 设置为 70 时,图章的大小似乎匹配。文本和坐标似乎仍然是镜像的。
  • 另外,当我不使用CAM::PDF 并且只是将由 wkhtmltopdf 生成的单个 PDF 文档直接传递给 PDF::API2 时,也会出现同样的问题。
  • 参见this answer,它通过使用 importPageIntoForm 方法然后覆盖新的文本和图形来解决这个问题。
  • @snoopy 谢谢,我会调查的。

标签: perl pdf perl-module


【解决方案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 中时,它正在使用更改后的状态。

【讨论】:

  • 我研究这个的原因是我正在为 Perl 6 - github.com/p6-pdf/perl6-PDF-Tools 编写一些 PDF 实用程序而苦恼。似乎有一种解决方法,在附加之前将主体包裹在 q .. Q 中。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多