PHP Получаване на височина и ширина в свойствата на PDF файла

Имам PDF файл. Бих искал да получа височината и ширината в мм.

Така че правя exec(pdfinfo ...); Имам този резултат:

Създател: Adobe InDesign CS5 (7.0.3) Продуцент: Acrobat Distiller 9.4.2 (Macintosh) Дата на създаване: Mon Jan 30 15:48:43 2012 ModDate: Fri Feb 10 10:35:05 2012 Маркирани: не Страници: 34 Шифровани: не Размер на страницата: 552.744 x 708.643 точки Размер на файла: 80724791 байта Оптимизиран: да PDF версия: 1.3

Имам скрипт, който извлича моята информация:

<?php 
$output = shell_exec("pdfinfo ".$pdflivrelink);
$data = explode("\n", $output); //puts it into an array
for($c=0; $c < count($data); $c++) {
        if(stristr($data[$c],"Pages") == true) {
        $pagesnumber = trim(substr($data[$c],6));
        }
        if(stristr($data[$c],"Page size") == true) {
            $pagesize_H = height_pdf(trim(substr($data[$c],9)));
        }
        if(stristr($data[$c],"Page size") == true) {
            $pagesize_L = width_pdf(trim(substr($data[$c],9)));
        }

}
function height_pdf($size){
$hauteur = round(substr($size,7,7)/2.83);
return $hauteur;
}
function width_pdf($size){
$largeur = round(substr($size,17,7)/2.83);
return $largeur;
} ?>

Всичко е наред, защото имам три числа с точка три числа (552.744 x 708.643). Но не знам защо някои PDF файлове имат тази информация:

Създател: pdftk 1.41 - www.pdftk.com Продуцент: iText 2.1.5 (от lowagie.com) Дата на създаване: Mon Feb 27 13:18:23 2012 ModDate: Mon Feb 27 16:26:12 2012 Маркирани: не Страници: 36 Шифровано: не Размер на страницата: 425,2 x 538,582 точки Размер на файла: 5097597 байта Оптимизирано: да PDF версия: 1.6

425.2 x 538.582 : Значи скриптът ми не работи!

Можеш ли да ми помогнеш? Благодаря много!


Тествам това:

    $output = shell_exec("pdfinfo ".$pdflivrelink);
    $data = explode("\n", $output); //puts it into an array
    for($c=0; $c < count($data); $c++) {
            if(stristr($data[$c],"Pages") == true) {
            $pagesnumber = trim(substr($data[$c],6));

            }
            if(stristr($data[$c],"Page size") == true) {
                echo $data[$c];
    preg_match('/Page size: ([0-9]*\.?[0-9]?) x ([0-9]*\.?[0-9]?)/', $data[$c], $matchess);
    $width = round($matchess[1]/2.83);
    $height = round($matchess[2]/2.83);

            }
}
echo "width = $width<br>height = $height";

резултатът е:

Размер на страницата: 425,2 x 538,582 точки ширина = 0 височина = 0


person Seb Gy    schedule 08.03.2012    source източник
comment
За по-добро разбиране на ширината на pdf вижте Как да заявите размера на страницата на pdf от командния ред?   -  person LF00    schedule 18.12.2019


Отговори (5)


Малък регулярен израз ще ви даде правилните резултати.

<?php
$str = 'Creator: pdftk 1.41 - www.pdftk.com Producer: iText 2.1.5 (by lowagie.com) CreationDate: Mon Feb 27 13:18:23 2012 ModDate: Mon Feb 27 16:26:12 2012 Tagged: no Pages: 36 Encrypted: no Page size: 425.2 x 538.582 pts File size: 5097597 bytes Optimized: yes PDF version: 1.6';

preg_match('/Page size: ([0-9]*\.?[0-9]?) x ([0-9]*\.?[0-9]?)/', $str, $matches);
$width = round($matches[1]/2.83);
$height = round($matches[2]/2.83);

echo "width = $width<br>height = $height";
?>

Актуализация (поискани са повече подробности): Пълен работен пример по-долу. Актуализирах Regex, за да съответства на реалния изход от pdfinfo

<?php

$output = shell_exec("pdfinfo ".$pdflivrelink);

// find page count
preg_match('/Pages:\s+([0-9]+)/', $output, $pagecountmatches);
$pagecount = $pagecountmatches[1];

// find page sizes
preg_match('/Page size:\s+([0-9]{0,5}\.?[0-9]{0,3}) x ([0-9]{0,5}\.?[0-9]{0,3})/', $output, $pagesizematches);
$width = round($pagesizematches[1]/2.83);
$height = round($pagesizematches[2]/2.83);

echo "pagecount = $pagecount <br>width = $width<br>height = $height";

?>
person AndrewR    schedule 08.03.2012
comment
Благодаря за вашата помощ! Имам ширина = 0 височина = 0 - person Seb Gy; 08.03.2012
comment
Защото все още изпълнявате $data = split() реда. Ако изречете регулярния израз директно на $output, това трябва да е всичко, което трябва да направите. Можете да се отървете от целия цикъл, ако комбинирате това с регулярния израз на другия отговор, за да получите номер на страница. - person AndrewR; 09.03.2012
comment
Можете ли да обясните по-подробно идеята си? Не всичко разбирам, благодаря - person Seb Gy; 10.03.2012
comment
@AndrewR Благодаря ви много за вашия ценен отговор .... бихте ли ми помогнали да получа px от това измерение ...? - person Nadimul De Cj; 11.02.2016

Направете го с preg_match():

// Debugging:
$output = shell_exec("pdfinfo ".$pdflivrelink);
var_dump($output);

// Dimension:
preg_match('~ Page size: ([0-9\.]+) x ([0-9\.]+) pts ~', $output, $matches);
var_dump($matches);


// No of pages:
preg_match('~ Pages ([0-9]+) ~', $output, $matches);
var_dump($matches);
person powtac    schedule 08.03.2012
comment
Благодаря за вашата помощ! Имам масив(0) {} - person Seb Gy; 08.03.2012
comment
Не е добре. $output е $output = shell_exec("pdfinfo ".$pdflivrelink); ? - person powtac; 08.03.2012
comment
да, когато правя $output = shell_exec(pdfinfo .$pdflivrelink); Нямам резултат, но когато направя $output =текста... това е резултат : array(3) { [0]=› string(32) Размер на страницата: 425,2 x 538,582 точки [1]=› string(5 ) 425.2 [2]=› низ(7) 538.582 } - person Seb Gy; 08.03.2012
comment
Правя това: preg_match('~ Размер на страницата: ([0-9\.]+) x ([0-9\.]+) точки ~', shell_exec(pdfinfo .$pdflivrelink), $съответствия); var_dump($съвпадения); същият резултат: масив(0) {} - person Seb Gy; 08.03.2012
comment
Опитайте шаблона No of pages:. - person powtac; 08.03.2012
comment
Работи ли, когато използвате това $output = 'Creator: pdftk 1.41 - www.pdftk.com Producer: iText 2.1.5 (by lowagie.com) CreationDate: Mon Feb 27 13:18:23 2012 ModDate: Mon Feb 27 16:26:12 2012 Tagged: no Pages: 36 Encrypted: no Page size: 425.2 x 538.582 pts File size: 5097597 bytes Optimized: yes PDF version: 1.6'; - person powtac; 08.03.2012
comment
Тогава нещо не е наред с shell_exec("pdfinfo ".$pdflivrelink) - person powtac; 09.03.2012
comment
Аз също приспадам това. Как ще го направим ? - person Seb Gy; 09.03.2012
comment
Дава ми: string(352) Заглавие: неизвестен Създател: Adobe InDesign CS5.5 (7.5) Продуцент: Adobe PDF Library 9.9 Дата на създаване: вторник, 31 януари 17:05:25 2012 г. ModDate: петък, 10 февруари 10:42:57 2012 г. Маркирани : да Страници: 34 Шифровано: не Размер на страницата: 581,108 x 793,7 точки Размер на файла: 31374145 байта Оптимизирано: да PDF версия: 1.3 (Става въпрос за нов PDF файл, не се притеснявайте) - person Seb Gy; 09.03.2012
comment

Защо не използвате обикновен PHP, за да получите размерите на PDF?

<?php
function get_pdf_dimensions($path, $box="MediaBox") {
    //$box can be set to BleedBox, CropBox or MediaBox 

    $stream = new SplFileObject($path); 

    $result = false;

    while (!$stream->eof()) {
        if (preg_match("/".$box."\[[0-9]{1,}.[0-9]{1,} [0-9]{1,}.[0-9]{1,} ([0-9]{1,}.[0-9]{1,}) ([0-9]{1,}.[0-9]{1,})\]/", $stream->fgets(), $matches)) {
            $result["width"] = $matches[1];
            $result["height"] = $matches[2]; 
            break;
        }
    }

    $stream = null;

    return $result;
}

var_dump(get_pdf_dimensions("file.pdf"));
person fltman    schedule 27.05.2015
comment
@fitman .. бях изпробвал вашия метод, но той показва null array() в изхода $result - person Nadimul De Cj; 11.02.2016
comment
@NadimulDeCj използва $box=BleedBox, за да получи ширина и височина. - person naf4me; 11.02.2016
comment
@MAH ... Благодаря ... имам ширина и височина ... но също така ми трябва номер на страница в pdf .... - person Nadimul De Cj; 11.02.2016
comment
Моля, използвайте този код, за да получите if(class_exists('Imagick')){ $image = new Imagick(); $image-›pingImage($pdf_файл); echo $image-›getNumberImages(); } - person naf4me; 11.02.2016

Използвайки Fpdi, отбелязвайки използването на getTemplateSize, това е...

const INCHESTOMM = 25.4;

public static function getPDFdimensions($strFilename): array
{
    $pdf1 = new FPDI('P', 'in');
    $pdf1->setSourceFile($strFilename);
    $tplIdx1 = $pdf1->importPage(1);
    $size = $pdf1->getTemplateSize($tplIdx1);
    $w = $size["width"];
    $h = $size["height"];
    return [round($w * self::INCHESTOMM), round($h * self::INCHESTOMM)];
}
person user2489234    schedule 23.02.2021

Тъй като знаете формата на низа за размер, можете също да го направите както по-долу. (Тази функция връща ширина и височина в масив.)

function size_pdf($size){
    $result = array();
    $tmp = exlode('x', $size);
    $result['height'] = round(trim($tmp[0])/2.83);
    $result['width'] = round(trim($tmp[1])/2.83);

    return $result;
}
person adidasadida    schedule 08.03.2012