2012-12-12 108 views
3

有沒有可靠的方法來檢測帶有perl腳本的空白頁?我試圖通過使用getPageText方法來執行以下腳本。如果我這樣做,只包含沒有文字圖形的頁面也會被識別爲空白頁面。用perl檢測並刪除PDF文件中的空白頁

#!/usr/bin/perl -w 

use CAM::PDF; 
my $filename=$ARGV[0]; 
my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n"; 
my $pages = $doc->numPages(); 
print $pages; 

$content=$doc->getPageText(1); 
print "length".length($content); 
if(length($content)==0) 
{ 
    print "File is empty"; 
} 

foreach my $p (1 .. $doc->numPages()) { 
    my $str = $doc->getPageText($p); 
    $str =~ m/[[:alnum:]]+/ms); # actually returned text 
    print "Result text:".qq($str); 
} 

是否有另一種方法來查找空白頁?

回答

3

對不起,沒有辦法可靠地檢測空白頁。

但是,我這樣做,在過去:

我用PDFTK到PDF衝進一個頁面的PDF文檔。 如果其中一個pdf大小非常低,則不包含圖像。 如果pdftotext返回空字符串,它不包含文本。 使用pdftk將所有好的pdf合併爲一個。

我希望它會幫助你。

+2

我希望你意識到這是非常危險的?十乘十像素的圖像可能不會對文件大小產生任何影響,所以你會錯過這個。如何處理僅包含空白字符的頁面(這將作爲文本返回,但不會標記頁面)。用矢量圖繪製簡單的頁面背景怎麼樣?這將需要大約40個字符左右的畫,但不會以任何方式顯示......有龍! –

+0

我知道。我沒有說這是一種好的或可靠的方法,但我沒有更好的方法。這裏有很多不同的pdf :-( – user1126070

0

如果使用getPageContentTree方法代替getPageText,則可以獲取包含頁面上所有對象(包括圖像)的內容流。檢查「內容」散列鍵的值的長度,如果它等於0,則表明您的頁面是真正的空白。

use CAM::PDF; 
my $filename="testBook.pdf"; 
my $doc = CAM::PDF->new($filename) || die "$CAM::PDF::errstr\n"; 
my $pages = $doc->numPages(); 

my $i = 1; 

while ($i <= $pages) { 
    my $contentTree = $doc->getPageContentTree($i); 

    my $content = $contentTree->{"content"}; 
    my $length = length($content); 

    if ($length == 0) { 
     print "page $i is blank!" ## delete it, log it to a list of blanks, etc. 
    } 
    $i++; 
} 
+0

其實,這可能有點安全但不是很多,我看過很多PDF文件,它們在內容流中有各種各樣的東西,但仍然會呈現一個完全空白的頁面我給出的頁面上只有空格的例子是一個,但是有很多頁面你只有保存/恢復或剪裁蒙版或者... –

+0

夠公平的 - 你說得對,可能會出現這種情況不會檢測並移除可視化顯示爲空白但在內容流中含有一些「不可見」內容的頁面,但該頁面並非真正空白,是嗎?這種方法的好處更多的是它不會刪除任何不應該被刪除的頁面 – uptownnickbrown

+0

你是完全正確的 - 它取決於你想要完成的是什麼,這正是我試圖用我的評論表明的。例如(其中大部分是我的經驗是),並且您試圖清除人們是否向您發送了空廣告,知道是否在該頁面上打印某些內容非常重要。因此我強調需要使用「安全」算法。 (或至少意識到你可能會讓自己陷入困境。 –