ฉันจะแปลงเอกสาร PDF เป็นภาพตัวอย่างใน PHP ได้อย่างไร [ปิด]


199

ไลบรารีส่วนขยายและอื่น ๆ ใดบ้างที่จำเป็นในการแสดงส่วนของเอกสาร PDF เป็นไฟล์ภาพ

ห้องสมุด PHP PDF ส่วนใหญ่ที่ฉันพบว่าเป็นศูนย์กลางในการสร้างเอกสาร PDF แต่มีวิธีง่ายๆในการแสดงเอกสารในรูปแบบภาพที่เหมาะสำหรับการใช้งานเว็บหรือไม่?

สภาพแวดล้อมของเราคือ LAMP stack


ฉันชอบที่จะสามารถทำเช่นนี้และมีไฟล์ที่มี.jpgนามสกุล ฉันลองใช้วิธี. htaccess AddHandler แล้ว แต่ก็ไม่ทำงาน
Keyslinger

คำตอบ:


228

คุณต้องการImageMagickและGhostScript

<?php
$im = new imagick('file.pdf[0]');
$im->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $im;
?>

วิธี[0]page 1


11
ใช่มันใช้งานได้ นอกจากนี้คุณยังสามารถทำเช่น: $ im-> setResolution (300, 300) เช่นเพื่อแสดงรูปแบบไฟล์ PDF ของคุณเมื่อต้องการแก้ไข
Luis Melgratti

6
ฉันไม่ได้ลอง แต่ถ้าคุณใช้ Google เอกสารและไม่สนใจ iFrame ข้อเสนอแนะนี้อาจใช้งานได้ (เป็นปลั๊กอิน wp ด้วย) forrst.com/posts/PDF_thumbnails_with_Google_Docs-6G6
David Hobs

4
แต่จะรวม ImageMagick และ GhostScript ไว้ในไฟล์ php ได้อย่างไร
namratha

1
@ think123 use $im->thumbnailImage(1500, 0);นั่นจะทำให้ภาพ jpg ของคุณเป็นความกว้าง 1500 และคงขนาดไว้ ดูเอกสาร
Kevin Jantzer

1
จากคำตอบของฉันด้านล่าง - หากคุณกำลังโหลด PDF จากบล็อกนี่คือวิธีที่คุณได้รับหน้าแรกแทนที่จะเป็นหน้าสุดท้าย: $ im-> readimageblob ($ blob); $ ญ> setiteratorindex (0);
jrjohnson

34

สำหรับผู้ที่ไม่มี ImageMagick ไม่ว่าด้วยเหตุผลใดก็ตามฟังก์ชั่น GD จะทำงานร่วมกับ GhostScript เรียกใช้คำสั่ง Ghostscript กับexec()การแปลงไฟล์ PDF เป็น JPG, imagecreatefromjpeg()และจัดการแฟ้มผลกับ

รันคำสั่ง ghostscript:

exec('gs -dSAFER -dBATCH -sDEVICE=jpeg -dTextAlphaBits=4 -dGraphicsAlphaBits=4 -r300 -sOutputFile=whatever.jpg input.pdf')

ในการจัดการให้สร้างภาพตัวแทนใหม่$newimage = imagecreatetruecolor(...)และนำภาพปัจจุบันมาใช้ $image = imagecreatefromjpeg('whatever.jpg')และจากนั้นคุณสามารถใช้imagecopyresampled()เพื่อเปลี่ยนขนาดหรือจำนวนอื่น ๆ ของimagemagickคำสั่งในตัวไม่ใช่คำสั่งใด ๆ


3
หากต้องการรับรูปภาพของหน้าแรกให้เพิ่มสวิตช์ -dFirstPage = 1 -dLastPage = 1 เข้ากับคำสั่ง
ทิมเดียร์บอร์น

หากยังไม่สามารถใช้งานได้คุณอาจต้องให้เส้นทางแบบเต็มไปยังgsไบนารี
craned

ดูเหมือนว่ากำลังเรียกใช้คำสั่งระบบ ถ้าผู้ใช้อัพโหลดไฟล์ชื่อsomething;rm -rf /?
iProgram

ถ้าฉันต้องการให้ pdf ทุกหน้าแปลงเป็นภาพ ถ้าอย่างนั้นจะทำอย่างไร?
ธารา

31

คุณยังสามารถนับจำนวนหน้าโดยใช้

$im->getNumberImages();

จากนั้นคุณสามารถสร้าง Thumbs ของทุกหน้าโดยใช้การวนซ้ำเช่น

'file.pdf['.$x.']'

34
(นี่ควรจะเป็นความเห็นเกี่ยวกับคำตอบของ Paolo Bergantino)
Simon East

คำตอบที่ชาญฉลาด ไม่ได้รับจากคนอื่น แต่คุณสังเกตเห็นและเขียน
Ashu Kumar

16

ใช้ส่วนขยายของ PHP Imagick ในการควบคุมขนาดที่ต้องการของอิมเมจเอาต์พุต raster ให้ใช้ฟังก์ชัน setResolution

<?php    
$im = new Imagick();
$im->setResolution(300, 300);     //set the resolution of the resulting jpg
$im->readImage('file.pdf[0]');    //[0] for the first page
$im->setImageFormat('jpg');
header('Content-Type: image/jpeg');
echo $im;
?>

(ส่วนขยายของ Paolo Bergantino คำตอบของเขาและ Luis Melgratti ความคิดเห็นของเขาคุณต้องตั้งค่าความละเอียดก่อนที่จะโหลดภาพ)


11

หากคุณกำลังโหลด PDF จากบล็อกนี่คือวิธีที่คุณได้รับหน้าแรกแทนที่จะเป็นหน้าสุดท้าย:

$im->readimageblob($blob);
$im->setiteratorindex(0);

10
(นี่ควรจะเป็นความเห็นเกี่ยวกับคำตอบของ Paolo Bergantino)
Simon East

9

คุณสามารถลองใช้งานยูทิลิตี้ 'แปลง' ที่มาพร้อมกับ imagemagick

exec("convert pdf_doc.pdf image.jpg");
echo 'image-0.jpg';

3
แทนที่จะเป็น pdf_doc.pdf แนะนำให้ใช้ pdf_doc.pdf [0]
John Kurlak

แปลงเป็นส่วนหนึ่งของแพคเกจ ImageMagick; ลอง sudo yum ติดตั้ง ImageMagick
Jack Miller

หากยังไม่สามารถใช้งานได้คุณอาจต้องระบุเส้นทางแบบเต็มไปยังconvertไบนารี
craned

1
echo 'image-0.jpg';ส่งคืนสตริง
suz

ทำงานให้ฉันขอบคุณ
Isabella

4

ฉันเป็นผู้เขียนPDFlibซึ่งเป็นGhostScript wrapper สำหรับ php ข้อดีของการใช้ไลบรารี่นี้คือมันผ่านการทดสอบแล้วและไม่ต้องการImageMagic

GhostScriptคำสั่งทุกครั้งเร็วกว่าImageMagicเมื่อพูดถึง pdf ดังนั้นคุณควรเลือก GhostScript wrapper หรือ GhostScript บริสุทธิ์

$pdflib = new ImalH\PDFLib\PDFLib();
$pdflib->setPdfPath($pdf_file_path);
$pdflib->setOutputPath($folder_path_for_images);
$pdflib->convert();

สวัสดีฉันใช้ PDFlib ของคุณเพื่อสร้าง PNG จาก PDF $ pdflib = ใหม่ ImalH \ PDFLib \ PDFLib (); $ pdflib-> setPdfPath ($ pdf_file_path); $ pdflib-> setOutputPath ($ folder_path_for_images); $ pdflib-> setImageFormat (\ ImalH \ PDFLib \ PDFLib :: $ IMAGE_FORMAT_PNG); $ pdflib-> setDPI (100); $ pdflib-> setPageRange (1, $ pdflib-> getNumberOfPages ()); $ pdflib-> แปลง (); PDFlib มีตัวเลือกในการตั้งค่าความกว้างและความสูงของไฟล์ PNG ที่สร้างขึ้นหรือไม่?
WGS

สวัสดี PDFLib ไม่มีวิธีการจัดการภาพ แต่คุณสามารถทำได้เช่นนี้ เมื่อคุณสร้าง pngs โดยใช้ PDFLib แล้วคุณสามารถใช้บรรณารักษ์การจัดการรูปภาพอย่าง github.com/Treinetic/ImageArtistเพื่อทำงานให้เสร็จ ...
imal hasaranga perera

โปรดลองวิธีการข้างต้นที่ฉันแนะนำ แต่ถ้าคุณยังคงดิ้นรนส่งอีเมลถึงฉันที่ imal@treinetic.com และฉันจะช่วยคุณออกด้วยรหัสตัวอย่าง ... ไชโย !!
imal hasaranga perera

ฉันจะลองดู ขอบคุณสำหรับคำแนะนำ
WGS

3

ฉันติดตั้งเสร็จแล้ว! มันใช้งานได้!

คุณอาจทำการติดตั้ง imagemagickบน Windows

ในการphp (local)ใช้โทรexec(<command line>) อดีต:

<?php
$pdf = "filename.pdf";
$info = pathinfo($pdf);
$file_name =  basename($pdf,'.'.$info['extension']);
echo $file_name;
$pdf = "filename.pdf[0]";
exec("convert $pdf convert-img/$file_name.jpg");    
?>

นอกจากนี้คุณอาจใช้class imagickในคลาส PHP Imagick

ขอบคุณทุกคนช่วยฉัน!


2

คิดต่างออกไปคุณสามารถใช้ไลบรารี่ต่อไปนี้เพื่อแปลงไฟล์ PDF เป็นภาพโดยใช้ javascript

http://usefulangle.com/post/24/pdf-to-jpeg-png-with-pdfjs


หากฉันต้องการแสดงภาพตัวอย่างในเซิร์ฟเวอร์เราจะใช้มันได้อย่างไร
Chithra

คุณอาจต้องการที่จะดูที่นี้: github.com/scandel/pdfThumbnails ฉันคิดว่าคุณสามารถอัปโหลดภาพขนาดย่อของภาพที่สร้างไว้ที่นี่พร้อมกับไฟล์จริงและบันทึกด้วยวิธีนี้คุณจะประหยัดเวลาในการคำนวณได้มากขึ้นบนเซิร์ฟเวอร์ของคุณ (เนื่องจากกระบวนการทำภาพขนาดย่อในคอมพิวเตอร์ฝั่งไคลเอ็นต์)
sajed zarrinpour

1

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


2
คำตอบสำหรับลิงก์เท่านั้นมีค่าต่ำใน StackOverflow เพราะหากลิงก์ย้ายหรือตายคำตอบนั้นจะไร้ประโยชน์อย่างแน่นอน เพื่อปรับปรุงคำตอบของคุณส่วนใหญ่ของโซลูชันของคุณควรจะฮาร์ดโค้ดที่นี่
mickmackusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.