PHP จำนวนหน้าในไฟล์ PDF ผ่าน ImageMagick

ฉันใช้โค้ดต่อไปนี้เพื่อดูจำนวนหน้าในไฟล์ PDF

$img = new imagick();
$img->setResolution(200,200);
$img->readImage("{$FileName}");
$NumberOfPages = $img->getNumberImages();
echo "$NumberOfPages";

รหัสใช้งานได้แต่ช้ามาก (0.5 วินาทีต่อหน้า PDF ขนาด 29 หน้าใช้เวลา 15 วินาทีในการส่งผลลัพธ์)

ฉันพลาดอะไรไปรึเปล่า? จะต้องมีวิธีที่เร็วกว่านี้ในการ:

1) รับจำนวนหน้าในรูปแบบ pdf

2) แปลงหน้าเดียวเป็นรูปภาพ

โปรดทราบว่า 2) เป็นไปได้หลังจาก 1) เสร็จสิ้นแล้วเท่านั้น ไม่มีประโยชน์ในการแปลง เช่น หน้า 39 เมื่อ PDF มีเพียง 16 หน้า

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก

เดวิด


person Cymro    schedule 28.12.2014    source แหล่งที่มา


คำตอบ (2)


ฉันลองใช้โค้ดของคุณแล้ว แต่ใช้ไม่ได้กับ PDF ที่ฉันมี ฉันใช้ Free PDF เพื่อสร้าง PDF อาจเป็นไปได้ว่าผลลัพธ์ PDF ที่ได้นั้นไม่ได้ทำให้เป็นเส้นตรง

ฉันพบโค้ดบางส่วนภายใต้คำถาม 1098156 และดูเหมือนว่าจะใช้ได้กับ PDF ที่ฉันมี:

function count_pages($pdfname) {
$pdftext = file_get_contents($pdfname);
$num = preg_match_all("/\/Page\W/", $pdftext, $dummy);
return $num;
}
person Cymro    schedule 31.12.2014
comment
โซลูชั่นที่ยอดเยี่ยม สำหรับไฟล์ PDF 30 หน้าใช้เวลาประมาณ 5 วินาที (ด้วย Imagick) แต่อันนี้เสร็จใน 50 มิลลิวินาที - person Skywarth; 22.11.2020
comment
สิ่งนี้ใช้ไม่ได้กับ PDF ที่มีการบีบอัดบางประเภท ใช้ Imagick::getnumberimages() หากคุณต้องการการสนับสนุนที่กว้างขึ้น - person Gavin; 10.12.2020

ตาม "ตรวจหาหน้าในไฟล์ PDF" ฉันไม่แนะนำให้ใช้ imagemagick ทุกครั้งที่เป็นไปได้สำหรับงานง่ายๆ ในการตรวจจับหน้าของไฟล์ PDF PDF มีคุณสมบัติเค้าโครง "เชิงเส้น" -> http://labs.appligent.com/pdfblog/linearization/ เพื่อตรวจจับข้อมูลเมตา PDF พื้นฐานบางส่วนจากจุดเริ่มต้นของไฟล์ นี่เป็นโค้ดง่ายๆ ในการรับจำนวนหน้า ฉันทดสอบด้วยไฟล์ PDF แบบสุ่ม 10 ไฟล์จากเว็บ ใช้งานได้ทุกครั้ง และควรจะเร็วกว่าโค้ดที่มี imagemagick มาก

นี่เป็นเพียงโค้ดสั้นๆ ไม่ได้รับการทดสอบอย่างดี แต่ควรให้แนวคิดแก่คุณในการทำงานนั้นใน PHP เท่านั้น ไฟล์ PDF ของคุณอาจไม่ใช่ทุกไฟล์ที่รับประกันเค้าโครงเชิงเส้นดังกล่าว

$pdfcontent = file_get_contents("test.pdf", NULL, NULL, 0, 300);
preg_match("~Linearized.*?\/N ([0-9]+)~s", $pdfcontent, $pages);
if(isset($pages[1])){
    echo "Pages ".$pages[1];
}
person Brain Foo Long    schedule 28.12.2014
comment
วิธีนี้ใช้ไม่ได้กับ PDF ที่มีการบีบอัดบางประเภท Imagick::getnumberimages() ใช้งานได้ - person Gavin; 10.12.2020