Sadece PHP bir PDF sayfa sayısını [kapalı]

10 Cevap php

PHP bir PDF sayfalarının sayısını saymak için bir yol gerekir. Ben google'da biraz ve ben de buldum kabuk / bash komut, perl veya diğer dilleri kullanan ettik tek şey yaptık, ama ben yerli PHP şey gerekiyor. Bu nasıl herhangi kütüphaneler veya örnekleri var mı?

10 Cevap

PHP için ImageMagick uzantısını kullanabilirsiniz. ImageMagick PDF'leri anlar ve sayfaların sayısını ayıklamak için identify komutunu kullanabilirsiniz. PHP işlevi Imagick::identifyImage().

Linux kullanıyorsanız, bu (özellikle sayfaların sayısının yüksek olan) sayfa sayısı almak için identify kullanarak çok daha hızlıdır:

exec('/usr/bin/pdfinfo '.$tmpfname.' | awk \'/Pages/ {print $2}\'', $output);

Yüklü pdfinfo gerekiyor.

Aslında kombine bir yaklaşımla gitti. Benim sunucuda exec özürlü beri ben bir PHP tabanlı çözüm sopa istedim, bu nedenle bu ile sona erdi:

Kod:

function getNumPagesPdf($filepath){
    $fp = @fopen(preg_replace("/\[(.*?)\]/i", "",$filepath),"r");
    $max=0;
    while(!feof($fp)) {
            $line = fgets($fp,255);
            if (preg_match('/\/Count [0-9]+/', $line, $matches)){
                    preg_match('/[0-9]+/',$matches[0], $matches2);
                    if ($max<$matches2[0]) $max=$matches2[0];
            }
    }
    fclose($fp);
    if($max==0){
        $im = new imagick($filepath);
        $max=$im->getNumberImages();
    }

    return $max;
}

Hiçbir Sayısı etiketleri vardır, çünkü şeyleri anlamaya yapamıyorsanız, o imagick php uzantısını kullanır. Ikincisi oldukça yavaş çünkü ben bir iki kat yaklaşım yapmak nedenidir.

Eğer sayfa numaralarını geri almak SourceFile ayarlarken Gördüğünüz gibi, ({[) (0]} bakınız) fpdi deneyebilirsiniz.

Ben bu oldukça eski olduğunu biliyorum ... ama şimdi benim için uygun ise, çok başkaları için uygun olabilir.

Burada listelenen yöntemleri verimsiz ve büyük PDF'ler için son derece yavaş olarak ben sadece, sayfa numaralarını alma bu yöntemi çalıştı.

$im = new Imagick();
$im->pingImage('name_of_pdf_file.pdf');
echo $im->getNumberImages();

Benim için büyük bir çalışma gibi görünüyor!

function getNumPagesPdf($filepath) {
    $fp = @fopen(preg_replace("/\[(.*?)\]/i", "", $filepath), "r");
    $max = 0;
    if (!$fp) {
        return "Could not open file: $filepath";
    } else {
        while (!@feof($fp)) {
            $line = @fgets($fp, 255);
            if (preg_match('/\/Count [0-9]+/', $line, $matches)) {
                preg_match('/[0-9]+/', $matches[0], $matches2);
                if ($max < $matches2[0]) {
                    $max = trim($matches2[0]);
                    break;
                }
            }
        }
        @fclose($fp);
    }

    return $max;
}

Bu i istiyor tam olarak ne:

I just worked out this method of getting pdf page numbers... after getting the pdf page count i just add break to the while so that it does not go in infinite loop here....

Bu deneyin:

<?php
if (!$fp = @fopen($_REQUEST['file'],"r")) {
        echo 'failed opening file '.$_REQUEST['file'];
}
else {
        $max=0;
        while(!feof($fp)) {
                $line = fgets($fp,255);
                if (preg_match('/\/Count [0-9]+/', $line, $matches)){
                        preg_match('/[0-9]+/',$matches[0], $matches2);
                        if ($max<$matches2[0]) $max=$matches2[0];
                }
        }
        fclose($fp);
echo 'There '.($max<2?'is ':'are ').$max.' page'.($max<2?'':'s').' in '. $_REQUEST['file'].'.';
}
?>

Kont etiketi farklı düğümler sayfa sayısını gösterir. Üst düğüm Count etiketi diğerlerinin toplamı, bu nedenle bu script sadece (o sayfaların sayısı) max arar.

bu imagick kullanmaz:

function getNumPagesInPDF($file) 
{
    //http://www.hotscripts.com/forums/php/23533-how-now-get-number-pages-one-document-pdf.html
    if(!file_exists($file))return null;
    if (!$fp = @fopen($file,"r"))return null;
    $max=0;
    while(!feof($fp)) {
            $line = fgets($fp,255);
            if (preg_match('/\/Count [0-9]+/', $line, $matches)){
                    preg_match('/[0-9]+/',$matches[0], $matches2);
                    if ($max<$matches2[0]) $max=$matches2[0];
            }
    }
    fclose($fp);
    return (int)$max;

}

Sadece PHP kullanarak, karmaşık kütüphane yüklemeden vs Apache yeniden başlatmayı ve (akışları açılış ve regex kullanarak gibi) çok saf PHP-yolları neden olabilir inaccurate.

Dahil cevabı aklıma sadece hızlı ve güvenilir yoludur. Yüklü olmak zorunda değildir ama tek bir yürütülebilir kullanır (* nix veya Windows ya) ve basit bir PHP komut dosyası çıkışını ayıklar. En iyi şey, ben henüz bir yanlış PageCount görmedim ki!

It can be found here, including why the other approaches "don't work":

Get the number of pages in a PDF document

* Nix ortamında kullanabilirsiniz:

exec('pdftops ' . $filename . ' - | grep showpage | wc -l', $output);

Pdftops varsayılan olarak yüklü olmalıdır nerede.

Ya Xethron önerilen:

pdfinfo filename.pdf | grep Pages: | awk '{print $2}'