pdf转图片,图片转pdf,图片压缩

written in python, pdf, 压缩
  1. 执行pdf转图片,再把图片转成pdf的脚本

#!/bin/bash
#参数为文件名,不含扩展.pdf 
for i in "$@";
do
python3 app.py $i
rm $i.pdf
python3 makepdf.py $i
rm -fr $i
done
  1. 把图片转成pdf

把指定目录中的图片根据名称排序,生成一个pdf文件,如果文件比较大 时间比较长,对内存要求也比较高 --dirname --makepdf.py --convert_dirname.pdf 在当前目录下生成 convert_name.pdf

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import io
import time
import os
import sys
from wand.image import Image
from wand.color import Color
from PyPDF2 import PdfFileReader, PdfFileWriter
from fpdf import FPDF

#把指定目录中的图片根据名称排序,生成一个pdf文件,如果文件比较大
#时间比较长,对内存要求也比较高
#--<name>   dir
#--makepdf.py
#--convert_name.pdf
#在当前目录下生成 convert_name.pdf

dir=sys.argv[1]
filelist=os.listdir(dir)
fl=[]
for f in filelist:
    if f.endswith(".jpg"):
        fl.append(f)
fl.sort()

#pdf = FPDF('P','pt')
#==========
#参数说明:
#'P'是竖向 'L'是横向
#'pt'是以像素为单位
#(1655,2580)是指定pdf的页面大小,根据实际图片大小调整
pdf = FPDF('P','pt',(1665,2580))
count=1
# imagelist is the list with all image filenames
for image in fl:
    pdf.add_page()
    fn=dir+'/'+image
    with Image(filename=fn) as img:
        w=img.width
        h=img.height
    print('make pdf',w,h)
    #pdf.image(image)
    pdf.image(fn,0,0,w,h)
    print(image)
    count=count+1
    if count >1000:
        break
pdf.output("convert_"+dir+".pdf", "F")
  1. pdf转成图片

参数为文件名,不含扩展名.pdf 参考了网上的代码,加以修改,如有冒犯请见谅

功能:在当前目录下建立以 《文件名》为名的目录 批量生成 文件名_001.jpg 序列图片 说明 _run_convert(filename,dir, page, res=79) res这个参数和导出的图片大小相关,我这里输出 分辨率是 1660x2500的样子 可以根据需要自行调整 调整之后,makepdf中的

:

# -*- coding: utf-8 -*-
import io
import time
import sys
import os
from wand.image import Image
fro` wand.color import Color
from PyPDF2 import PdfFileReader, PdfFileWriter

memo = {}


def getPdfReader(filename):
    reader = memo.get(filename, None)
    if reader is None:
        reader = PdfFileReader(filename, strict=False)
        memo[filename] = reader
    return reader


def _run_convert(filename,dir, page, res=79):
    #idx = page + 1
    temp_time = time.time() * 1000
    # 由于每次转换的时候都需要重新将整个PDF载入内存,所以这里使用内存缓存
    pdfile = getPdfReader(filename)
    pages=pdfile.getNumPages()
    print(pages) 
    output_pdf=PdfFileWriter()
    output_pdf_name='convert_'+filename
    for idx in range(0,pages):
    #for idx in range(0,10):
        pageObj = pdfile.getPage(idx)

        dst_pdf = PdfFileWriter()
        dst_pdf.addPage(pageObj)

        pdf_bytes = io.BytesIO()
        dst_pdf.write(pdf_bytes)
        pdf_bytes.seek(0)

        img = Image(file=pdf_bytes, resolution=res)
        img.format = 'jpg'
        img.compression_quality = 80
        img.background_color = Color("white")
        w=img.width
        h=img.height
        #ratio=1650/w
        #print('ratio=',ratio)
        #img.resize(int(img.width*ratio), int(img.height*ratio))

        print('exract picture',w,'x',h,   '     ',img.width,img.height)
    # 保存图片
        img_path = '%s/%s-%03d.jpg' % (dir,filename[:filename.rindex('.')], idx+1)
        print(img_path)
        #img.resize
        img.save(filename=img_path)
        img.destroy()
   `    img = None
        with Image(filename=img_path) as img:
            jpeg_bin = img.make_blob('jpeg')

        pdf_bytes = None
        dst_pdf = None
        print('convert page %d cost time %d' % (idx, (time.time() * 1000 - temp_time)))




if __name__ == '__main__':
#print(sys.argv[1])
    filename=sys.argv[1]+'.pdf'   
    os.system('mkdir '+sys.argv[1])
    _run_convert(filename,sys.argv[1], 1)