В зависимости от возможностей вашего генератора PDF, изображения могут быть сохранены со слабым, без потерь или даже без сжатия.Вы можете использовать следующий метод для извлечения информации об изображении из PDF, чтобы проверить, является ли это вашим случаем.Если это так, можно использовать какое-то программное обеспечение « сжатие PDF ».
(Это может показаться странным, но я действительно не нашел ни одного заранее написанного программного обеспечения, которое могло быthis)
Установите пакеты Python 2.x и PDFMiner (инструкции по установке см. в руководстве PDFMiner # cmap ), затем используйте следующий код для отображения всех изображений вдокумент, их размеры и сжатие.Список и объяснение алгоритмов сжатия, используемых PDF, см. В PDF-спецификации , стр. 23 (таблица «Стандартные фильтры»).
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
# Open a PDF file.
fp = open('Reader.pdf', 'rb')
# Create a PDF parser object associated with the file object.
parser = PDFParser(fp)
# Create a PDF document object that stores the document structure.
doc = PDFDocument()
# Connect the parser and document objects.
parser.set_document(doc)
doc.set_parser(parser)
# Supply the password for initialization.
# (If no password is set, give an empty string.)
doc.initialize('')
# Check if the document allows text extraction. If not, abort.
if not doc.is_extractable:
raise PDFTextExtractionNotAllowed
# Create a PDF resource manager object that stores shared resources.
rsrcmgr = PDFResourceManager()
from pdfminer.layout import LAParams, LTImage
from pdfminer.converter import PDFPageAggregator
# Set parameters for analysis.
laparams = LAParams()
# Create a PDF page aggregator object.
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
#Build layout trees of all pages
layouts=[]
for page in doc.get_pages():
interpreter.process_page(page)
# receive the LTPage object for the page.
layouts.append(device.get_result())
#search the trees for images and show their info,
# excluding repeating ones
known_ids=set()
count=0;size=0
def lsimages(obj):
global count; global size
if hasattr(obj,'_objs'):
for so in obj._objs:
if isinstance(so,LTImage):
i=so; id=i.stream.attrs['ID'].objid
if id not in known_ids:
a=i.stream.attrs
print a
count+=1;size+=a.get('Length',0)
known_ids.add(id)
lsimages(so)
for l in layouts:
lsimages(l)
print "Total: %d images, %d bytes"%(count,size)
Кредиты: стандартный код взят из Программирование с PDFMiner статья.