ตัวเลือกการบีบอัด pdftk


94

ฉันใช้pdftkเพื่อบีบอัด pdf โดยใช้บรรทัดคำสั่งต่อไปนี้

pdftk file1.pdf output file2.pdf compress

มันทำงานได้เนื่องจากน้ำหนักของไฟล์ของฉันลดลง

มี [ตัวเลือก] ในการเปลี่ยนการบีบอัด ???

หรือวิธีแก้ปัญหาอื่น ๆ ในการบีบอัดไฟล์ของฉัน? มันหนักเพราะกราฟิกบางจุดมีมาก มีวิธีแปลงกราฟเหล่านี้เป็น jpg และปรับการบีบอัดหรือไม่


1
จากประสบการณ์ของฉันมันขึ้นอยู่กับสิ่งที่อยู่ใน pdf ของคุณ ตัวอย่างเช่นหากเป็นกราฟที่มีจุดหลายจุดวิธีแก้ปัญหาที่ดีที่สุดคือการแปลงกราฟเป็น png และรวม png นี้ลงใน pdf
RockScience

คำตอบ:


123

ฉันมีปัญหาเดียวกันและพบวิธีแก้ปัญหาที่แตกต่างกันสองวิธี (ดูหัวข้อนี้สำหรับรายละเอียดเพิ่มเติม) ทั้งสองลดขนาดไฟล์ PDF ที่ไม่มีการบีบอัดของฉันลงอย่างมาก

  • Pixelated (lossy):

    convert input.pdf -compress Zip output.pdf
    
  • ไม่พิกเซล (ไม่สูญเสีย แต่อาจแสดงแตกต่างกันเล็กน้อย):

    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH  -dQUIET -sOutputFile=output.pdf input.pdf
    

แก้ไข : ฉันเพิ่งค้นพบตัวเลือกอื่น (สำหรับการบีบอัดแบบไม่สูญเสีย) ซึ่งหลีกเลี่ยงคำสั่ง gs ที่น่ารังเกียจ qpdfเป็นเครื่องมือที่เรียบง่ายที่แปลงไฟล์ PDF (การบีบอัด / คลายการบีบอัดการเข้ารหัส / ถอดรหัส) และเร็วกว่าคำสั่ง gs มาก:

qpdf --linearize input.pdf output.pdf

3
น่ากลัว gs ทำงานให้ฉันแปลงไฟล์ 4MB เป็น 339K มีการสูญเสียคุณภาพ แต่ก็ตอบสนองจุดประสงค์ของฉันอย่างเพียงพอ
Sridhar Sarnobat

27
คุณสามารถใช้การตั้งค่า PDF "เครื่องพิมพ์" เพื่อคุณภาพที่ดีขึ้น:gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
imriss

10
หากต้องการปรับคุณภาพ (และขนาด) ให้เปลี่ยนค่า PDFSETTINGS ดูghostscript.com/doc/current/Ps2pdf.htm#Options
1in9ui5t

6
โปรดทราบว่าgsคำสั่งในคำตอบไม่ได้สูญเสียไปอย่างแน่นอนเนื่องจากจะลดความละเอียดและคุณภาพของ JPG ที่ฝังลง แต่มันเป็นอีกครั้งที่ไม่สูญเสีย ข้อความโดยเก็บไว้เป็นข้อความในขณะที่convertคำสั่งจะแปลงเป็นกราฟิกแรสเตอร์
tanius

14
การตั้งค่าตัวเลือก-dPDFSETTINGS=เพื่อ/ebookให้ได้ผลลัพธ์ที่ดีมากสำหรับฉัน: แน่นอนว่ามันถูกบีบอัดและสิ่งประดิษฐ์ jpg บางส่วนสามารถมองเห็นได้ แต่มันสามารถอ่านได้ทั้งหมดสำหรับขนาดที่เหมาะสม ขอบคุณ!
Joël

35

ขั้นตอนนี้ใช้ได้ดีทีเดียว

pdf2ps large.pdf very_large.ps

ps2pdf very_large.ps small.pdf

ให้มันลอง.


8
นี่ไม่ใช่วิธีแก้ปัญหาทั่วไป ในหลาย ๆ กรณี pdf ที่ได้จะมีขนาดใหญ่กว่า
rotskoff

4
วิธีนี้ได้ผลดีที่สุดจากโซลูชันที่กล่าวถึงทั้งหมดสำหรับฉัน ภาพขนาดใหญ่สองสามภาพลดลงจาก 23MB เป็น 1.4MB โดยสูญเสียคุณภาพน้อยที่สุด
AerandiR

1
@rotskoff อาจไม่มีวิธีแก้ปัญหาทั่วไปเนื่องจากมีเอกสารประเภทต่างๆ อย่างไรก็ตามฉันเห็นประเด็นของคุณ คงจะดีไม่น้อยหากมีซอฟต์แวร์ที่ค้นหาสิ่งที่ดีที่สุดสำหรับเรา
tiktak

ขอบคุณสิ่งนี้ใช้ได้ผลสำหรับฉันในขณะที่ qpdf และ gs ไม่ได้ลดขนาดของไฟล์เอาต์พุต
sebastian

1
ดังที่ได้กล่าวไว้ที่นี่ข้อเสียเปรียบอีกประการหนึ่งของวิธีนี้คือจะทำให้ลิงก์ URL ภายในเอกสารเสียหาย
ptomato

32

กำลังพยายามบีบอัด PDF ที่ฉันสร้างด้วย tiff 400ppi ส่วนใหญ่เป็น 8 บิต 24 บิตไม่กี่ตัวพร้อมการบีบอัด PackBits โดยใช้tiff2pdfบีบอัดด้วย Zip / Deflate ปัญหาหนึ่งที่ฉันมีกับวิธีการเหล่านี้ทุกวิธี: ไม่มีวิธีใดข้างต้นที่เก็บรักษาบุ๊กมาร์ก TOC ที่ฉันสร้างขึ้นด้วยตนเองอย่างระมัดระวังใน Acrobat Pro X แม้แต่การebookตั้งค่าที่แนะนำสำหรับgs. แน่นอนว่าฉันสามารถเปิดสำเนาของต้นฉบับที่มี TOC เหมือนเดิมและทำReplace pagesแต่น่าเสียดายที่วิธีการเหล่านี้ไม่ได้ผลที่น่าพอใจในการเริ่มต้น ไม่ว่าจะลดขนาดลงมากจนคุณภาพเป็นพิกเซลที่ไม่เป็นที่ยอมรับหรือไม่ได้ลดขนาดเลยและในกรณีหนึ่งก็เพิ่มขึ้นจริงแม้จะสูญเสียคุณภาพก็ตาม

pdftk compress:

no change in size
bookmarks TOC are gone

gs screen:

takes a ridiculously long time and 100% CPU
errors:
    sfopen: gs_parse_file_name failed.                                 ? 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->10.2MB hideously pixellated
bookmarks TOC are gone

gs printer:

takes a ridiculously long time and 100% CPU
no errors
74.8MB-->66.1MB
light blue background on pages 1-4
bookmarks TOC are gone

gs ebook:

errors:
    sfopen: gs_parse_file_name failed.
      ./base/gsicc_manage.c:1050: gsicc_open_search(): Could not find default_rgb.ic 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->32.2MB
badly pixellated
bookmarks TOC are gone

qpdf --linearize:

very fast, a few seconds
no size change
bookmarks TOC are gone

pdf2ps:

took very long time
output_pdf2ps.ps 74.8MB-->331.6MB

ps2pdf:

pretty fast
74.8MB-->79MB
very slightly degraded with sl. bluish background
bookmarks TOC are gone

2
นี่เป็นงานวิจัยที่มีคุณค่าอย่างยิ่ง (ขอบคุณ!) แต่มันก็ไม่ใช่คำตอบสักเท่าไหร่ที่ฉันคิดถึงการโหวตลงคะแนน
ndemou

3
ยังไงก็ไม่ใช่คำตอบ
hmj6jmh

22

หากขนาดไฟล์ยังใหญ่เกินไปอาจช่วยในการใช้ ps2pdf เพื่อลดขนาดความละเอียดของไฟล์ pdf ที่สร้างขึ้น:

pdf2ps input.pdf tmp.ps
ps2pdf -dPDFSETTINGS=/screen -dDownsampleColorImages=true -dColorImageResolution=200 -dColorImageDownsampleType=/Bicubic tmp.ps output.pdf

ปรับค่าของอ็อพชัน -dColorImageResolutionเพื่อให้ได้ผลลัพธ์ที่ตรงกับความต้องการของคุณ (ค่านี้อธิบายความละเอียดของภาพใน DPI) ถ้าใส่ไฟล์ของคุณอยู่ในระดับสีเทาเปลี่ยนสีผ่านสีเทาหรือใช้ทั้งสองตัวเลือกในคำสั่งดังกล่าวยังสามารถช่วยเหลือ นอกจากนี้การปรับจูนเป็นไปได้โดยการเปลี่ยน-dPDFSETTINGSตัวเลือกในการเริ่มต้น /หรือ/ เครื่องพิมพ์ สำหรับคำอธิบายในตัวเลือกที่เป็นไปได้ทั้งหมดปรึกษาคู่มือ ps2pdf


1
ขอบคุณสำหรับเคล็ดลับ ด้วย -dPDFSETTINGS ฉันสามารถลดขนาดไฟล์ PDF ที่สแกนได้
eshwar

2
ขอบคุณ. ฉันไม่คิดว่าจะมีวิธีแก้ปัญหาทั่วไปสำหรับกรณีการใช้งานของทุกคน - แต่ฉันลองเกือบทุกวิธีในเธรดนี้และนี่เป็นวิธีเดียวที่เหมาะกับฉัน !!! ความสามารถในการ "ปรับแต่ง" พารามิเตอร์ dColorImageResolution เป็นสิ่งสำคัญ - ต้องทำให้ขนาดเอกสารเล็กพอที่ไซต์ของรัฐบาลนี้จะยอมรับได้ แต่ใหญ่พอที่จะอ่านได้ ขอบคุณลุงแซมสำหรับห่วงที่เจ็บปวดอีกอันที่จะข้ามผ่าน :)
Michael Klear

4

หลังจากลองใช้ gpdf ตามที่nullglobแนะนำฉันพบว่าฉันได้ผลลัพธ์การบีบอัดที่เหมือนกัน (ไฟล์ ~ 900mb ถึง ~ 30mb) เพียงแค่ใช้เครื่องพิมพ์ cups-pdf สิ่งนี้อาจง่ายกว่า / ต้องการหากคุณกำลังดูเอกสารอยู่แล้วและต้องการบีบอัดเอกสารเพียงหนึ่งหรือสองฉบับ

ใน Ubuntu 12.04 คุณสามารถติดตั้งได้โดย

sudo apt-get install cups-pdf

หลังจากการติดตั้งโปรดตรวจสอบในSystem Tools > Administration > Printing > คลิกขวาที่ 'PDF' และตั้งค่าเป็น 'enable'

ตามค่าเริ่มต้นผลลัพธ์จะถูกบันทึกลงในโฟลเดอร์ชื่อPDFในโฮมไดเร็กทอรีของคุณ


4

ตัวเลือก pdf2ps บรรทัดเดียว (โดย Lee) ช่วยเพิ่มขนาด pdf ได้จริง อย่างไรก็ตามสองขั้นตอนแรกทำได้ดีกว่า และสามารถรวมเป็นหนึ่งเดียวโดยใช้การเปลี่ยนเส้นทางจาก & ไปยังอินพุต / เอาต์พุตมาตรฐานและท่อ:

pdf2ps large.pdf - | ps2pdf - small.pdf

ได้ลด PDF ที่สร้างโดย xsane จาก 18 Mo เหลือ 630 ko!

ลิงค์หายไป แต่สำหรับตัวอย่างปัจจุบันไม่น่ากังวล ... และเป็นวิธีที่ง่ายที่สุดในการบรรลุผลลัพธ์ที่ต้องการ


คุณสามารถลองps2pdfแทนดูความคิดเห็นของฉันต่อคำตอบของ @ ลี
myrdd

4

pdf2ps large.pdf small.pdf ก็เพียงพอแล้วแทนที่จะเป็นสองขั้นตอน

pdf2ps large.pdf very_large.ps 
ps2pdf very_large.ps small.pdf

อย่างไรก็ตามps2pdf large.pdf small.pdfเป็นทางเลือกที่ดีกว่า

  • ps2pdf เร็วกว่ามาก
  • โดยไม่ได้ระบุพารามิเตอร์เพิ่มเติมpdf2psบางครั้งก็สร้างไฟล์ขนาดใหญ่ขึ้น

คุณพบตัวเลือกนี้ที่ไหน เป็นคุณลักษณะในเวอร์ชันล่าสุดหรือไม่ มันไม่ได้ผลสำหรับฉัน แม้ว่าฉันจะตั้งชื่อไฟล์เอาต์พุตout.pdfแต่มันก็กลายเป็นไฟล์ PS ( mimetype out.pdfพูดout.pdf: application/postscript)
myrdd

ของฉันเป็นเวอร์ชันล่าสุด 9.xx. ไม่แน่ใจของคุณ
Lee

ฉันใช้เวอร์ชันแพ็กเกจ debian stable ("stretch") ซึ่งก็คือ 9.25 คุณช่วยตรวจสอบได้ไหมว่าคุณมีไฟล์ pdf โดยพิมพ์mimetype small.pdfหรือไม่?
myrdd

ผลลัพธ์ของmimetype small.pdfคือsmall.pdf: application/pdf. ฉันคิดว่าโปรแกรมสามารถกำหนดประเภทไฟล์โดยอัตโนมัติตามคำต่อท้าย
Lee

1
@myrdd ใช่ฉันทำการทดสอบ ps2pdfจะดีกว่า.
Lee

1

ฉันไม่เห็นการลดขนาดไฟล์ลงมากนักโดยใช้ qpdf วิธีที่ดีที่สุดที่ฉันพบคือหลังจาก pdftk เสร็จแล้วให้ใช้ ghostscript เพื่อแปลง pdf เป็น postscript แล้วกลับเป็น pdf ใน PHP คุณจะใช้ exec:

$ps = $save_path.'/psfile.ps';
exec('ps2ps2 ' . $pdf . ' ' . $ps);
unlink($pdf);
exec('ps2pdf ' .$ps . ' ' . $pdf);
unlink($ps);

ฉันใช้สิ่งนี้เมื่อสองสามนาทีก่อนเพื่อรับเอาต์พุต pdftk จาก 490k ถึง 71k


2
PHP เพิ่มความซับซ้อนที่ไม่จำเป็นโดยสิ้นเชิงและทำให้การบังคับใช้คำตอบนี้แคบลง
ndemou

-2

ฉันมีปัญหาเดียวกันและฉันใช้ฟังก์ชั่นนี้เพื่อบีบอัดแต่ละหน้าซึ่งส่งผลให้ขนาดไฟล์ถูกบีบอัดไม่เกิน 1/3 ของขนาดต้นฉบับ

for (int i = 1; i <= theDoc.PageCount; i++)
{
       theDoc.PageNumber = i;
       theDoc.Flatten();
}

1
คุณใช้ไลบรารี C ++ ของ pdftk หรือไม่
RockScience

-3

ในกรณีที่คุณต้องการบีบอัด PDF ซึ่งมีข้อความที่เลือกได้จำนวนมากบน Windows คุณสามารถใช้NicePDF Compressor - เลือกตัวเลือก "Flate" หลังจากลองทุกอย่าง (cpdf, pdftk, gs) ในที่สุดก็ช่วยให้ฉันบีบอัด PDF 1360 หน้าจาก 500 MB ลงมาเป็น 10 MB

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