2013-12-13 27 views
2

我正在製作一個應用程序,該應用程序可生成多頁(有時爲數百或數千頁)的PDF文檔以進行打印。每個頁面都包含一個通用模板,其中包含一些頁面特定內容(請參閱:自動填寫紙質表單的「名稱」字段)。生成多頁PDF而不復制每個頁面上的模板?

,但問題是,模板是相當大(約100KB /頁),並複製它跨越非常較大的PDF文件(目前是通過使用rsvg-convert生成的PDF每一頁產量轉換目錄全的SVG文件轉換爲PDF)。

是否可以通過引用靜態模板來減少重複,以便每個PDF頁面只包含自定義內容?

理想情況下,我想知道如何用Python或Ghostscript來做到這一點,但任何出發點將不勝感激。

回答

1

你想要的是Form XObjects裏面的PDF文件。從PDF參考:

甲形式x對象是圖形對象(包括路徑 對象,文本對象,並且採樣的圖像)的任何序列的自包含 描述一個PDF內容流。一個表單XObject可能被多次繪製(在多個頁面上或在同一頁面上的多個位置 上繪製),並且每次都會產生相同的結果,在調用時只會將 圖形狀態調整。這個 共享定義不僅在PDF文件中是經濟的,而且在 合適的情況下,PDF消費者應用程序可以優化 的執行方式,通過緩存渲染表單XObject的結果來重複使用 。

許多應用程序添加例如水印到PDF頁面,自動將它們添加爲Form XObjects。舉個例子,你可以添加背景模板內容到現有的已經具有特定頁面的內容多頁PDF,使用PDFTK:

pdftk multipage.pdf background template.pdf output multipage+.pdf 

使用Ghostscript,你應該有模板EPS,然後創建多頁PDF添加了Form XObjects,然後使用其他方法添加頁面特定的內容。但是,也許可以實現一些聰明的功能,通過使用「僅限Ghostscript」將特定頁面強加給PDF。要創建「準備填充」與模板Form XObject每一頁上多頁PDF,做這樣的事情:

gs -sDEVICE=pdfwrite -o 100_pages_template.pdf \ 
-c '[/_objdef {background} /BBox [0 0 595 841] /BP pdfmark 
save /showpage {} def 
0 0 translate  % adjust according to EPS BBox 
(template.eps) run 
restore 
[/EP pdfmark 
1 1 100 { 
    [{background} /SP pdfmark 
    showpage 
} for' 

不知道Python的,我認爲這是因爲使用Perl下面的例子一樣簡單。在這裏,我也在每頁上創建100頁PDF和模板:

use strict; 
use warnings; 
use PDF::API2; 

my $pdf = PDF::API2->new(); 
my $tmpl = PDF::API2->open('template.pdf'); 
my $xo = $pdf->importPageIntoForm($tmpl, 1); 
for (1..100) { 
    my $page = $pdf->page(); 
    my $gfx = $page->gfx(); 
    $gfx->formimage($xo, 0, 0); 

    # add page specific content 

} 
$pdf->saveas('out.pdf'); 
+0

太棒了!謝謝。 –