2012-12-18 21 views
2

我目前使用的PDF::Extract模塊如何使用`sprintf`在PDF ::

我想摘錄:

testing.pdf 

腳本:

use strict; 

use PDF::Extract; 

my $input = $ARGV[0]; 
my $newpdf = new PDF::Extract(PDFDoc => $input); 
my $i = 1; 
$i++ while ($newpdf->savePDFExtract(PDFPages => sprintf("%03d", $i))); 

該腳本成功運行,但在提取過程中會丟失一些頁面。 2點:

use strict; 

use PDF::Extract; 

my $input = $ARGV[0]; 
my $newpdf = new PDF::Extract(PDFDoc => $input); 
my $i = 1; 
$i++ while ($newpdf->savePDFExtract(PDFPages => $i)); 

這個腳本運行成功和所有頁面提取成功,但我所有的頁面中提取,並與序列001002003

例如:

testing001.pdf 
testing002.pdf 
testing003.pdf 

...等。

所有頁面也以這種形式沒有缺少的頁面。我怎樣才能得到這個?

+0

我不明白「所有頁面也沒有丟失頁面的這種形式」。你能詳細說明一下嗎? – mpe

回答

1

PDFPages參數取得一個頁碼列表。它並不旨在讓您指定自定義文件命名方案。您可以指定自己的名稱,而不是,是這樣的:

$i++ while ($newpdf->savePDFExtract(
     PDFPages => $i, 
     PDFSaveAs => $base_file_name . sprintf("%03d", $i) 
    ) 
); 
+0

謝謝你很好的工作 – user1811486

0

你應該總是use warnings,這是不一樣use strict爲關鍵,但將提供那些容易被忽視的問題一些有價值的調試信息。

我知道這不是文檔所說的,但是您也應該避免使用new PDF::Extract中的間接對象表示法。類方法調用PDF::Extract->new更安全。

我不明白你的程序爲什麼跳頁,因爲字符串001與數值1一樣有效。但指定輸出文件名的方法是將xcall的PDFSaveAs選項設置爲所需的文件名字符串。

此代碼的工作原理是從原始文件名構建sprintf格式。例如,它將testing.pdf更改爲testing%03.pdf。這種格式可用於調用setVars來命名文件,然後生成它。

use strict; 
use warnings; 

use PDF::Extract; 

my $input = $ARGV[0]; 
my $format = $input =~ s/\.([^.]*)\z/%03d.$1/r; 

my $newpdf = new PDF::Extract(PDFDoc => $input); 

my $i = 1; 
while (1) { 
    $newpdf->setVars(PDFSaveAs => sprintf($format, $i)); 
    my $success = $newpdf->savePDFExtract(PDFPages => $i)); 
    last unless $success; 
    ++$i; 
} 
+0

跳過頁面可能與它處理PDFPages選項允許的擴展語法有關。你可以輸入像'1-5 8'這樣的東西。 – dan1111

0

這個腳本對於你正在嘗試做的事情是矯枉過正的。我只想用PDFTK: http://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/

它可以完成你所需要的非常有效:

pdftk testing.pdf burst output testing%03d.pdf 

如果您需要這是一個Perl腳本的一部分,你可以召喚出一個系統調用來PDFTK 。

+0

pdftk看起來像一個有用的建議,但我幾乎不會稱這個小小的腳本「過度殺傷」。如果Perl需要其他功能,通常最好使用Perl模塊,而不是對外部程序進行系統調用。 – dan1111

+0

你說得對,「矯枉過正」可能太強大了!但是如果這是腳本完成的唯一任務,我會說爲什麼重新發明輪子? – uptownnickbrown