рдлрд╝реЛрди рдХреА рдлрд╝реЛрдЯреЛ рд╕реЗ рдмрдиреА PDF рдЖрдорддреМрд░ рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреА рд╡рдЬрд╣ рд╕реЗ рднрд╛рд░реА рдирд╣реАрдВ рд╣реЛрддреАред рд╡рд╣ рдЗрд╕рд▓рд┐рдП рднрд╛рд░реА рд╣реЛрддреА рд╣реИ рдХрд┐ рд╣рд░ рдкреЗрдЬ рдкрд░ 3000 рдкрд┐рдХреНрд╕рд▓ рдХреА рдПрдХ JPEG рд▓рдЧреА рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ рдХрд╛рдЧрд╝рдЬрд╝ рдХреЛ рдЙрд╕рдХреЗ рдПрдХ рдЫреЛрдЯреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреА рд╣реА рдЬрд╝рд░реВрд░рдд рд╣реИред рд╕рд╛рдЗрдЬрд╝ рдШрдЯрд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдЙрди рдЗрдореЗрдЬ рдХреЛ рдвреВрдБрдврдирд╛, рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдХрд┐ рд╡реЗ рдХрд┐рддрдиреА рдШрдиреА рдбреНрд░реЙ рд╣реЛ рд░рд╣реА рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕рдордЭрджрд╛рд░ рд╕рд╛рдЗрдЬрд╝ рдкрд░ рд░реАрд╕реИрдВрдкрд▓ рдХрд░рдирд╛ рдФрд░ рд╡рд╛рдкрд╕ рд▓рд┐рдЦ рджреЗрдирд╛ред osFoundry рдбреЗрд╕реНрдХрдЯреЙрдк рдРрдк рдХрд╛ PDF Editor рдпрд╣реА рдХрд╛рдо рджреЛ рдХреНрд▓рд┐рдХ рдореЗрдВ рдХрд░ рджреЗрддрд╛ рд╣реИ (All tools, Compress a PDF, Advanced optimization)ред рдиреАрдЪреЗ рд╡рд╣реА рддрд░реАрдХрд╝рд╛ PyMuPDF рдФрд░ Pillow рдХреЗ рд╕рд╛рде рдХрд╝рд░реАрдм 30 рд▓рд╛рдЗрди рдХреЗ Python рдореЗрдВ рд╣реИ, рдПрдХ рдЯреЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдкрд░ рдирд╛рдкрд╛ рд╣реБрдЖ, рдФрд░ рдЙрд╕реА рдЗрдирдкреБрдЯ рдкрд░ рдРрдк рдХреЗ рдирддреАрдЬреЗ рд╕реЗ рддреБрд▓рдирд╛ рдХреЗ рд╕рд╛рдеред
рдЯреЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ 6 рдкреЗрдЬ рдХрд╛ рд▓реАрдЬрд╝ рдПрдЧреНрд░реАрдореЗрдВрдЯ рд╣реИ: рд╣рд░ рдкреЗрдЬ 3024├Ч4032 рдХреА JPEG рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╛рдЧрд╝рдЬрд╝ рдХрд╛ рджрд╛рдирд╛ рдФрд░ рдЕрд╕рдорд╛рди рд░реЛрд╢рдиреА рд╣реИ, рдФрд░ рд╡рд╣ 612├Ч816 pt рдХреЗ рдкреЗрдЬ рдкрд░ рд▓рдЧреА рд╣реИред рдлрд╝рд╛рдЗрд▓ 32,227,412 рдмрд╛рдЗрдЯ (30.7 MiB) рдХреА рд╣реИред рдпрд╣ рджрд╛рдирд╛ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ: JPEG рдХреЛ рдмрдбрд╝рд╛ рдиреЙрдЗрдЬрд╝ рдмрдирд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдиреАрдЪреЗ рдХреЗ рд╕рд╛рд░реЗ рд╕рд╛рдЗрдЬрд╝ рдЗрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╣реИрдВ, рдФрд░ рдЬрд╝реНрдпрд╛рджрд╛ рд╕рд╛рдлрд╝ рд╕реНрдХреИрди рдЫреЛрдЯреЗ рд╕рд╛рдЗрдЬрд╝ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ рдФрд░ рдХрдо рд╕рд┐рдХреБрдбрд╝реЗрдЧрд╛ред
рдкрд╣рд▓реЗ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдЬрдЧрд╣ рдХреМрди рдШреЗрд░ рд░рд╣рд╛ рд╣реИ
рдХреБрдЫ рднреА рдмрджрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрдВрдЯреЗрдВрдЯ рдХреА рдХрд╝рд┐рд╕реНрдо рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЬреЛрдбрд╝ рд▓реЗрдВред рд╕реНрдХреИрди рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд╛рдЗрди рдХрд╛рдлрд╝реА рд╣реИ:
import os, pymupdf
doc = pymupdf.open("scan.pdf")
img = sum(len(doc.xref_stream_raw(i[0])) for p in doc for i in p.get_images(full=True))
print(img, "of", os.path.getsize("scan.pdf"))
32221241 of 32227412
рдлрд╝рд╛рдЗрд▓ рдХрд╛ 99.98% рд╣рд┐рд╕реНрд╕рд╛ рдЗрдореЗрдЬ рд╣реИрдВред рдЯреЗрдХреНрд╕реНрдЯ, рдкреЗрдЬ рдЯреНрд░реА рдФрд░ PDF рдХрд╛ рдмрд╛рдХрд╝реА рд╕рд╛рд░рд╛ рд╣рд┐рд╕рд╛рдм-рдХрд┐рддрд╛рдм рдорд┐рд▓рд╛рдХрд░ рд╕рд┐рд░реНрдлрд╝ 6,171 рдмрд╛рдЗрдЯ рд╣реИред рдЕрдЧрд░ рдпрд╣ рд╕рдВрдЦреНрдпрд╛ 20% рдЖрддреА, рддреЛ рдЗрдореЗрдЬ рд░реАрд╕реИрдВрдкрд▓ рдХрд░рдирд╛ рд╕рд╣реА рдФрдЬрд╝рд╛рд░ рдирд╣реАрдВ рд╣реЛрддрд╛, рдФрд░ рдХрд┐рд╕реА рднреА рдХрдВрдкреНрд░реЗрд╕рд░ рдХреА рдХреЛрдИ рд╕реЗрдЯрд┐рдВрдЧ рдЬрд╝реНрдпрд╛рджрд╛ рдирд╣реАрдВ рдмрдЪрд╛ рдкрд╛рддреАред рдРрдк рдореЗрдВ рдпрд╣ рдЬрд╛рдБрдЪ рдкрд╣рд▓реЗ рд╕реЗ рд╣реИ (Audit space usage); рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдЙрд╕рдХреА рдЯреЗрдмрд▓ рдореЗрдВ Images 32,225,071 рдмрд╛рдЗрдЯ (99.99%), Content Streams 714, Document Overhead 1,627 рджрд┐рдЦрддрд╛ рд╣реИред рд╡рд╣ рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдирд╣реАрдВ рдЧрд┐рдирддрд╛ рдЬреИрд╕реЗ рдКрдкрд░ рдХреА рдПрдХ рд▓рд╛рдЗрди рдЧрд┐рдирддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рджреЛрдиреЛрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рдХреБрдЫ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХрд╛ рдЕрдВрддрд░ рд╣реИред
рдЗрдореЗрдЬ рдХреА рд░реЗрдЬрд╝реЛрд▓реНрдпреВрд╢рди рддрдм рддрдХ рдирд╣реАрдВ рд╣реЛрддреА рдЬрдм рддрдХ рд╡рд╣ рдбреНрд░реЙ рди рд╣реЛ
PDF рдХреЗ рдЕрдВрджрд░ JPEG рд╕рд┐рд░реНрдлрд╝ рдкрд┐рдХреНрд╕рд▓ рдХрд╛ рдПрдХ рдЧреНрд░рд┐рдб рд╣реИред рдкреНрд░рддрд┐ рдЗрдВрдЪ рдкрд┐рдХреНрд╕рд▓ рдореЗрдВ рдЙрд╕рдХреА рдШрдирддрд╛ рдЗрд╕рд╕реЗ рддрдп рд╣реЛрддреА рд╣реИ рдХрд┐ рдкреЗрдЬ рдЙрд╕реЗ рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рдбреНрд░реЙ рдХрд░рддрд╛ рд╣реИред PyMuPDF рджреЛрдиреЛрдВ рд╣рд┐рд╕реНрд╕реЗ рджреЗрддрд╛ рд╣реИ:
page = doc[0]
xref, w, h = page.get_images(full=True)[0][0], *page.get_images(full=True)[0][2:4]
rect = page.get_image_rects(xref)[0] # where the page draws it, in points
ppi = w / (rect.width / 72)
print(w, h, round(rect.width / 72, 2), round(ppi))
3024 4032 8.5 356
рдЗрдореЗрдЬ 8.5 рдЗрдВрдЪ рдЪреМрдбрд╝реА рдбреНрд░реЙ рд╣реБрдИ рд╣реИ, рддреЛ 8.5 рдЗрдВрдЪ рдкрд░ 3024 рдкрд┐рдХреНрд╕рд▓ рдпрд╛рдиреА 356 ppiред рдЫрдкреЗ рдкреЗрдЬ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╝рд░реАрдм 150 рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдЙрд╕рд╕реЗ рднреА рдХрдо рдЪрд▓рддрд╛ рд╣реИред рдпрд╣реА рдЗрдореЗрдЬ рдЖрдзреЗ рд╕рд╛рдЗрдЬрд╝ рдореЗрдВ рдбреНрд░реЙ рд╣реЛрддреА рддреЛ 712 ppi рд╣реЛрддреА, рдЗрд╕реАрд▓рд┐рдП ppi рд╣рд░ рдЗрдореЗрдЬ рдФрд░ рд╣рд░ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдирд┐рдХрд╛рд▓рдиреА рдкрдбрд╝рддреА рд╣реИ, рдХрд┐рд╕реА рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб рд╕реЗ рдирд╣реАрдВ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреАред
рд░реЗрдЬрд╝реЛрд▓реНрдпреВрд╢рди рдФрд░ рдХреНрд╡рд╛рд▓рд┐рдЯреА рдХреА рдХрд╝реАрдордд
рд╕рдВрдЦреНрдпрд╛рдПрдБ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рджреЛ рдкреЗрдЬреЛрдВ рдХреА рдЗрдореЗрдЬ рдкрд░ рдПрдХ рд╕реНрд╡реАрдк рдХрд┐рдпрд╛: рдкрд╛рдБрдЪ рдЯрд╛рд░рдЧреЗрдЯ рдШрдирддрд╛рдПрдБ рдЧреБрдгрд╛ рдЪрд╛рд░ JPEG рдХреНрд╡рд╛рд▓рд┐рдЯреА, рдПрдХ рдЗрдореЗрдЬ рдХрд╛ рдФрд╕рдд рд╕рд╛рдЗрдЬрд╝ рдФрд░ рд░реЗрдлрд╝рд░реЗрдВрд╕ рдХреЗ рдореБрдХрд╝рд╛рдмрд▓реЗ PSNR рдХреЗ рд╕рд╛рдеред рд░реЗрдлрд╝рд░реЗрдВрд╕ рдореВрд▓ рдЗрдореЗрдЬ рд╣реИ рдЬрд┐рд╕реЗ Lanczos рд╕реЗ 1275├Ч1700 (150 ppi) рдкрд░ рд░реАрд╕рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛; рддреБрд▓рдирд╛ рд╕реЗ рдкрд╣рд▓реЗ рд╣рд░ рд╡реЗрд░рд┐рдПрдВрдЯ рдХреЛ рдЙрд╕реА рдЧреНрд░рд┐рдб рдкрд░ рд░реАрд╕рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП 100 рдФрд░ 72 ppi рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рдмрдбрд╝рд╛ рдХрд░рдиреЗ рдХреА рдзреБрдВрдзрд▓рд╛рд╣рдЯ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред PSNR рдПрдХ рдореЛрдЯрд╛-рд╕рд╛ рдкреИрдорд╛рдирд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдБ рдореИрдВрдиреЗ OCR рдирд╣реАрдВ рдЪрд▓рд╛рдпрд╛ред рдпрд╣ рд╕рд┐рд░реНрдлрд╝ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдХреНрд╡рд╛рд▓рд┐рдЯреА рддреЗрдЬрд╝реА рд╕реЗ рдХрд╣рд╛рдБ рдЧрд┐рд░рдиреЗ рд▓рдЧрддреА рд╣реИред
| рдЯрд╛рд░рдЧреЗрдЯ ppi | q90 | q75 | q60 | q40 |
|---|---|---|---|---|
| 356 (рдореВрд▓ рд╕рд╛рдЗрдЬрд╝) | 3713 KiB / 44.0 dB | 1392 KiB / 41.7 dB | 941 KiB / 40.3 dB | 590 KiB / 39.5 dB |
| 225 | 985 KiB / 41.5 dB | 491 KiB / 39.6 dB | 333 KiB / 38.5 dB | 244 KiB / 37.7 dB |
| 150 | 431 KiB / 38.8 dB | 225 KiB / 36.6 dB | 167 KiB / 35.1 dB | 135 KiB / 33.8 dB |
| 100 | 210 KiB / 33.1 dB | 119 KiB / 31.7 dB | 94 KiB / 30.6 dB | 76 KiB / 29.4 dB |
| 72 | 118 KiB / 28.3 dB | 72 KiB / 27.6 dB | 57 KiB / 26.9 dB | 45 KiB / 26.0 dB |
рджреЛ рдмрд╛рддреЗрдВ рдЕрд▓рдЧ рд╕реЗ рджрд┐рдЦрддреА рд╣реИрдВред рдЙрд╕реА рдХреНрд╡рд╛рд▓рд┐рдЯреА рдкрд░ 356 рд╕реЗ 150 ppi рдЬрд╛рдиреЗ рд╕реЗ рдХрд╝рд░реАрдм 88% рдмрд╛рдЗрдЯ рдШрдЯ рдЬрд╛рддреЗ рд╣реИрдВ (q75: 1392 рд╕реЗ 225 KiB), рдЬрдмрдХрд┐ рдкреВрд░реЗ рд╕рд╛рдЗрдЬрд╝ рдкрд░ рд╕рд┐рд░реНрдлрд╝ JPEG рдХреНрд╡рд╛рд▓рд┐рдЯреА q90 рд╕реЗ q40 рддрдХ рдЧрд┐рд░рд╛рдиреЗ рдкрд░ рднреА 590 KiB рдмрдЪрддреЗ рд╣реИрдВ, рдЬреЛ q75 рдкрд░ 150 ppi рдХреЗ 225 KiB рдХреЗ рджреЛрдЧреБрдиреЗ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рд╣реИред рдФрд░ 150 рд╕реЗ рдиреАрдЪреЗ рдбреЗрд╕рд┐рдмрд▓ рдЕрдЪрд╛рдирдХ рдЧрд┐рд░ рдЬрд╛рддреЗ рд╣реИрдВ: q90 рдкрд░ 100 ppi, q40 рдкрд░ 150 ppi рд╕реЗ рднреА рдиреАрдЪреЗ рд╣реИред рдЫрдкреЗ рдЯреЗрдХреНрд╕реНрдЯ рд╡рд╛рд▓реЗ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдбреЗрдЯрд╛ рдореЗрдВ рдмреАрдЪ рдХреА рдХреНрд╡рд╛рд▓рд┐рдЯреА рдкрд░ 150 ppi рд╡рд╣ рдореЛрдбрд╝ рд╣реИ рдЬрд╣рд╛рдБ рдХрд░реНрд╡ рдореБрдбрд╝рддрд╛ рд╣реИред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ
рдирд┐рдпрдо рд╡рд╣реА рд╣реИрдВ рдЬреЛ рдРрдк рдЕрдкрдиреЗ рдбрд╛рдпрд▓реЙрдЧ рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ: рдЗрдореЗрдЬ 225 ppi рд╕реЗ рдКрдкрд░ рдбреНрд░реЙ рд╣реЛ рддреЛ 150 ppi рдкрд░ рдбрд╛рдЙрдирд╕реИрдВрдкрд▓ рдХрд░реЛ, рдордзреНрдпрдо рдХреНрд╡рд╛рд▓рд┐рдЯреА рдХреА JPEG рдмрдирд╛рдУ, рдФрд░ рдЗрдореЗрдЬ рддрднреА рдмрджрд▓реЛ рдЬрдм рдирддреАрдЬрд╛ рдЫреЛрдЯрд╛ рд╣реЛред
import io, os, sys, pymupdf
from PIL import Image
def shrink(src, dst, target=150, above=225, quality=60):
doc = pymupdf.open(src)
seen = set()
for page in doc:
for info in page.get_images(full=True):
xref, w, h = info[0], info[2], info[3]
if xref in seen:
continue
seen.add(xref)
rect = page.get_image_rects(xref)[0]
ppi = w / (rect.width / 72)
if ppi <= above:
continue
raw = doc.xref_stream_raw(xref)
im = Image.open(io.BytesIO(raw)).convert("RGB")
im = im.resize((round(w * target / ppi), round(h * target / ppi)), Image.LANCZOS)
out = io.BytesIO()
im.save(out, "JPEG", quality=quality)
if out.tell() >= len(raw):
continue # not smaller: keep the original
doc.update_stream(xref, out.getvalue(), compress=False)
doc.xref_set_key(xref, "Width", str(im.width))
doc.xref_set_key(xref, "Height", str(im.height))
doc.xref_set_key(xref, "Filter", "/DCTDecode")
doc.xref_set_key(xref, "ColorSpace", "/DeviceRGB")
doc.save(dst, garbage=4, deflate=True)
shrink(sys.argv[1], sys.argv[2])
print(os.path.getsize(sys.argv[1]), "->", os.path.getsize(sys.argv[2]))
рдЯреЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдкрд░, uvx рд╕реЗ рд▓рд┐рдП рдЧрдП PyMuPDF рдФрд░ Pillow рдХреЗ рд╕рд╛рде, рдЗрд╕ Mac рдкрд░ рдЗрд╕реЗ 2.8 рд╕реЗрдХрдВрдб рд▓рдЧреЗ:
30.7 MiB -> 0.92 MiB (97% smaller), 6 images replaced
рдПрдХ рдЬрд╛рд▓ рдХреА рд╡рдЬрд╣ рд╕реЗ рдореЗрд░реА рдкрд╣рд▓реА рдорд╛рдк рдЧрд╝рд▓рдд рдЖрдИред рдореЗрд░реЗ рдкрд╣рд▓реЗ рд╡рд░реНрд╢рди рдиреЗ page.replace_image(xref, stream=...) рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛, рдЬреЛ рд╕рдмрд╕реЗ рд╕реАрдзрд╛ рдХреЙрд▓ рд▓рдЧрддрд╛ рдерд╛, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ 1.83 MiB рдЖрдпрд╛, рдпрд╛рдиреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдЙрд╕рдХрд╛ рджреЛрдЧреБрдирд╛ред рдЙрд╕рдиреЗ рдирдИ рдЗрдореЗрдЬ рдХреЛ рдирдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рддрд░рд╣ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдФрд░ рдкреБрд░рд╛рдиреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд░рд╣ рдЧрдП, рдЗрд╕рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣рд░ рдкреЗрдЬ рдХреЗ рджреЛрдиреЛрдВ рд╡рд░реНрд╢рди рдереЗ: рдлрд╝рд╛рдЗрд▓ рдХреА рд╕реНрдЯреНрд░реАрдо рд╕реНрдХреИрди рдХрд░рдиреЗ рдкрд░ 12 рдмрдбрд╝реА рд╕реНрдЯреНрд░реАрдо рдорд┐рд▓реАрдВ, рдФрд░ рд╣рд░ рдирдИ рдХреЗ рд╕рд╛рде рдЙрддрдиреЗ рд╣реА рд╕рд╛рдЗрдЬрд╝ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдереАред рдореМрдЬреВрджрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣реА update_stream рд╕реЗ рд╕реНрдЯреНрд░реАрдо рд▓рд┐рдЦрдиреЗ рдФрд░ рдЙрд╕рдХреА Width, Height, Filter рдФрд░ ColorSpace рдХреБрдВрдЬрд┐рдпрд╛рдБ рдареАрдХ рдХрд░рдиреЗ рдкрд░ 0.92 MiB рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдЫрд╣ рд╕реНрдЯреНрд░реАрдо 107 рд╕реЗ 172 KB рдХреА рд░рд╣рддреА рд╣реИрдВред
рдРрдк рдХрд┐рддрдирд╛ рдХрд╝рд░реАрдм рд╣реИ
рдРрдк рдиреЗ рдЙрд╕реА рдЗрдирдкреБрдЯ рдХреЛ рдПрдХ рдХреЙрдкреА en (optimized).pdf рдХреЗ рд░реВрдк рдореЗрдВ 1,097,087 рдмрд╛рдЗрдЯ (1.0 MiB) рдкрд░ рд╕реЗрд╡ рдХрд┐рдпрд╛, 97% рдЫреЛрдЯрд╛, рдЫрд╣ рдЗрдореЗрдЬ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рд╣реЛрдХрд░ред PyMuPDF рд╕реЗ рдЙрд╕рдХреА рдЗрдореЗрдЬ рд╡рд╛рдкрд╕ рдкрдврд╝рдиреЗ рдкрд░ рд╣рд░ рдПрдХ 1275├Ч1700 рдкрд┐рдХреНрд╕рд▓ рдХреА рдирд┐рдХрд▓рддреА рд╣реИ, рдкреЗрдЬ рдкрд░ 150 ppi, рдФрд░ 130,834 рд╕реЗ 194,130 рдмрд╛рдЗрдЯ рдХреАред рдКрдкрд░ рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ 0.92 MiB рджреЗрддреА рд╣реИ, рдереЛрдбрд╝рд╛ рдЫреЛрдЯрд╛ред
рдлрд╝рд░реНрдХрд╝ рдПрдирдХреЛрдбрд░ рдореЗрдВ рд╣реИред Pillow рдХрд┐рд╕реА JPEG рдХреА рдХреНрд╡рд╛рдВрдЯрд╛рдЗрдЬрд╝реЗрд╢рди рдЯреЗрдмрд▓ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдРрдк рдХреА рдЯреЗрдмрд▓ рдХреА рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ [13, 9, 8, 13, 19, 32, 41, 49] рд╣реИред Pillow рдареАрдХ рдпрд╣реА рдкрдВрдХреНрддрд┐ quality=60 рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдпрд╛рдиреА рдРрдк рдХреЗ рдбрд╛рдпрд▓реЙрдЧ рдХрд╛ "Medium" рдпрд╣рд╛рдБ libjpeg рдХреНрд╡рд╛рд▓рд┐рдЯреА 60 рд╣реИ, рдЬреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЬреИрд╕рд╛ рд╣реА рд╣реИред рдРрдк рдХреА рдЗрдореЗрдЬ рдореЗрдВ рдкреВрд░реЗ рд░реЗрдЬрд╝реЛрд▓реНрдпреВрд╢рди рдХрд╛ рд░рдВрдЧ рднреА рд░рд╣рддрд╛ рд╣реИ (Pillow рдЙрдирдХреА chroma sampling 4:4:4 рдкрдврд╝рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ Pillow рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ 4:2:0 рд╣реИ)ред рдкреЗрдЬ 1 рдХреЗ рд▓рд┐рдП, 4:4:4 рдФрд░ optimize=True рдХреЗ рд╕рд╛рде Pillow 178,447 рдмрд╛рдЗрдЯ рджреЗрддрд╛ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ 171,678, рдЬрдмрдХрд┐ рдРрдк рдХрд╛ 194,130 рд╣реИ, рдЗрд╕рд▓рд┐рдП рдРрдк рд╢рд╛рдпрдж рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реНрдб Huffman рдЯреЗрдмрд▓ рднреА рдирд╣реАрдВ рдмрдирд╛рддрд╛ред рдпрд╣ рд╕рд╛рдЗрдЬрд╝ рдореЗрдВ рдХреБрдЫ рдкреНрд░рддрд┐рд╢рдд рдХрд╛ рдлрд╝рд░реНрдХрд╝ рд╣реИ, рдФрд░ рд░рдВрдЧреАрди рдлрд╝реЙрд░реНрдо рдХреЗ рд╕реНрдХреИрди рдкрд░ рдкреВрд░реЗ рд░рдВрдЧ рдХрд╛ рдмреНрдпреЛрд░рд╛ рдмрдЪрд╛рдП рд░рдЦрдирд╛ рдлрд╝рд╛рдпрджреЗ рдХрд╛ рд╕реМрджрд╛ рд╣реИред
рддрднреА рдмрджрд▓реЗрдВ рдЬрдм рдЫреЛрдЯрд╛ рд╣реЛ
out.tell() >= len(raw) рд╡рд╛рд▓реА рдЬрд╛рдБрдЪ рд╕рдЬрд╛рд╡рдЯ рдирд╣реАрдВ рд╣реИред рдРрдк рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреА рдкреЗрдЬ-1 рд╡рд╛рд▓реА рдЗрдореЗрдЬ рдХреЛ рдХреНрд╡рд╛рд▓рд┐рдЯреА 90 рдкрд░ рджреЛрдмрд╛рд░рд╛ рдПрдирдХреЛрдб рдХрд░реЗрдВ: рд╡рд╣ 284,133 рдмрд╛рдЗрдЯ рдХреА рдирд┐рдХрд▓рддреА рд╣реИ, рдЬрдмрдХрд┐ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдЗрдореЗрдЬ 194,130 рдмрд╛рдЗрдЯ рдХреА рд╣реИред рдЬрд┐рд╕ рдХреНрд╡рд╛рд▓рд┐рдЯреА рд╕реЗ JPEG рдмрдиреА рдереА рдЙрд╕рд╕реЗ рдКрдБрдЪреА рдХреНрд╡рд╛рд▓рд┐рдЯреА рдкрд░ рджреЛрдмрд╛рд░рд╛ рдПрдирдХреЛрдб рдХрд░рдиреЗ рд╕реЗ рд╡рд╣ рдмрдбрд╝реА рд╣реЛ рдЬрд╛рддреА рд╣реИ, рдФрд░ рдЬрд╝реНрдпрд╛рджрд╛ рд╢рд╛рд░реНрдк рдирд╣реАрдВ рд╣реЛрддреАред рдЗрд╕ рдЬрд╛рдБрдЪ рдХреЗ рдмрд┐рдирд╛, рдХрдВрдкреНрд░реЗрд╕рд░ рдХреЛ рджреЛ рдмрд╛рд░ рдЪрд▓рд╛рдиреЗ рдкрд░, рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдХрдВрдкреНрд░реЗрд╕реНрдб рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЪрд▓рд╛рдиреЗ рдкрд░, рдлрд╝рд╛рдЗрд▓ рдмрдврд╝ рд╕рдХрддреА рд╣реИред
рдмрд╛рдХрд╝реА рдХрд╛рдо ppi рдХреА рдЬрд╛рдБрдЪ рдХрд░рддреА рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЙрд╕рдХреЗ рдЕрдкрдиреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдФрд░ рдРрдк рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдЪрд▓рд╛рдиреЗ рд╕реЗ рджреЛрдиреЛрдВ рдмрд╛рд░ 0 рдЗрдореЗрдЬ рдмрджрд▓реА рдЧрдИрдВ: рд╣рд░ рдЗрдореЗрдЬ рдкрд╣рд▓реЗ рд╕реЗ 150 ppi рдкрд░ рд╣реИ, 225 рдХреА рд╕реАрдорд╛ рд╕реЗ рдиреАрдЪреЗ, рдФрд░ рдлрд╝рд╛рдЗрд▓ рдмрд╕ рджреЛрдмрд╛рд░рд╛ рд╕реЗрд╡ рд╣реЛрддреА рд╣реИ (рдРрдк рдХреА 1.0 MiB рдХреА рдХреЙрдкреА 1.05 MiB рдХреА рдирд┐рдХрд▓реА, рд╕рд┐рд░реНрдлрд╝ рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦрдиреЗ рдХреА рд╡рдЬрд╣ рд╕реЗ, рдХрд┐рд╕реА рдЗрдореЗрдЬ рдХреЛ рдЫреБрдП рдмрд┐рдирд╛)ред
рдпрд╣ рдХрд╣рд╛рдБ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛
рдпрд╣ рддрднреА рдорджрдж рдХрд░рддрд╛ рд╣реИ рдЬрдм рдСрдбрд┐рдЯ рдмрддрд╛рдП рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЬрд╝реНрдпрд╛рджрд╛рддрд░ рд╣рд┐рд╕реНрд╕рд╛ рдЗрдореЗрдЬ рд╣реИред рд╡рд░реНрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реЗ рдПрдХреНрд╕рдкреЛрд░реНрдЯ рдХреА рдЧрдИ PDF рдореЗрдВ рдбрд╛рдЙрдирд╕реИрдВрдкрд▓ рдХрд░рдиреЗ рд▓рд╛рдпрдХрд╝ рдкреЗрдЬ рдЗрдореЗрдЬ рд╣реЛрддреА рд╣реА рдирд╣реАрдВред рдФрд░ рдирддреАрдЬрд╛ lossy рд╣реИ: рдКрдкрд░ рдХреА рдЯреЗрдмрд▓ рдореЗрдВ рджрд┐рдЦреА рдХреНрд╡рд╛рд▓рд┐рдЯреА рдХреА рдХрдореА рдЕрд╕рд▓реА рд╣реИ, рдФрд░ рдореВрд▓ рдлрд╝рд╛рдЗрд▓ рдЬрд╕ рдХреА рддрд╕ рд░рдЦрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕реА рд╡рдЬрд╣ рд╕реЗ рдРрдк рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдирдИ рдХреЙрдкреА рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рдпрд╣реА рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП dst рдХрд╛ src рд╕реЗ рдЕрд▓рдЧ рд╣реЛрдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИред
рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдФрд░ рд╣реИ рдЬреЛ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рдЗрдЬрд╝ рд╕реЗ рдЖрдЧреЗ рдпрд╣ рдХреНрдпреЛрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИред рдореЗрд▓ рдлрд╝рд╛рдЗрд▓реЗрдВ base64 рдореЗрдВ рдЕрдЯреИрдЪ рдХрд░рддрд╛ рд╣реИ, рдпрд╛рдиреА рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╣рд░ 3 рдмрд╛рдЗрдЯ рдкрд░ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ 4 рдмрд╛рдЗрдЯ, рдКрдкрд░ рд╕реЗ рд▓рд╛рдЗрди рдмреНрд░реЗрдХред рдЯреЗрд╕реНрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЛ Python рдХреЗ base64.encodebytes рд╕реЗ рдЗрд╕ рддрд░рд╣ рдПрдирдХреЛрдб рдХрд░рдиреЗ рдкрд░ 30.7 MiB рдХреА PDF рдХреЗ рд▓рд┐рдП 41.5 MiB рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 25 MB рдХреА рд╕реАрдорд╛ рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдЗрдЬрд╝ рд╕реЗ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реЗ рдЕрдВрджрд╛рдЬрд╝реЗ рд╕реЗ рдХрд╣реАрдВ рдЬрд╝реНрдпрд╛рджрд╛ рдмрд╛рд░ рдЯреВрдЯ рд╕рдХрддреА рд╣реИред рдпрд╣реА рдЧрдгрд┐рдд рднреЗрдЬреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд╝рд░реАрдм 18 MB рд╕реЗ рдиреАрдЪреЗ рд░рдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реИред
PDF Editor osFoundry рдбреЗрд╕реНрдХрдЯреЙрдк рдРрдк рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ osFoundry рдбрд╛рдЙрдирд▓реЛрдб рдкреЗрдЬ рд╕реЗ рдореБрдлрд╝реНрдд рд╣реИред рдпрд╣ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдХреИрд╕реЗ рд░рдЦрддрд╛ рд╣реИ, рдпрд╣ local-first рдкреЗрдЬ рдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
Top comments (0)