Parece que isso não é (ainda) possível de fazer na linha de comando, mas eu achei uma maneira fácil de fazer o script em python usando o módulo python pdfrw assim:
#!/usr/bin/env python
import sys
import os
import zlib
import Image
import StringIO
from pdfrw import PdfReader, PdfDict, PdfArray, PdfName, PdfWriter
def process_image(image):
if image["/Filter"] == PdfName("FlateDecode"):
pass
elif image["/Filter"] == PdfName("DCTDecode"):
im = Image.open(StringIO.StringIO(image.stream))
outf = StringIO.StringIO()
im.save(outf, "JPEG", quality=45)
image.stream = outf.getvalue()
outf.close()
def find_images(obj, visited=set()):
if not isinstance(obj, (PdfDict, PdfArray)):
return
myid = id(obj)
if myid in visited:
return
visited.add(myid)
if isinstance(obj, PdfDict):
if obj.Type == PdfName.XObject and obj.Subtype == PdfName.Image:
process_image(obj)
obj = obj.itervalues()
for item in obj:
find_images(item, visited)
if __name__ == '__main__':
inpfn,outfn = sys.argv[1:]
reader = PdfReader(inpfn)
find_images(reader)
PdfWriter().addpages(reader.pages).write(outfn)
Você pode implementar o que quiser na função process_images
e até coisas complicadas como chamar programas externos para modificar a imagem atual podem ser facilmente executadas. Neste exemplo, usamos apenas o PIL para reencodificar imagens jpeg com uma qualidade de 45.