会社でこんなことが起こっていた...
- このpdfを画像にしてほしい → 印刷してスキャナにかける (!?)
- pdf全ページに社外秘スタンプ押したい → 印刷して全ページに社外秘のゴム印押してスキャナ (!!??)
資源大事に。
python使ってpdfを分解&画像編集&pdf化します
ちなみにadobe acrobatにはスタンプ機能や透かし機能もある
純正機能では実現できないような加工に使えるかも。
#実行した環境
- windows 10 pro
- Python 3.7.3 (anoaconda)
- poppler-0.67.0_x86
- Pillow==7.1.2
- img2pdf==0.4.0
#事前準備
- 外部ソフトPopplerをインストール(poppler-0.67.0_x86を使用)
- 解凍したファイルの中の binフォルダを環境変数に追加しておく
#最初にフォルダ構成
#この部分はcmdから実行
dir_path = 'C:\\Users\\user\\Desktop\\topdf'
import os
from pdf2image import convert_from_path, convert_from_bytes
images = convert_from_path(os.path.join(dir_path,'a.pdf'))
for i in range(0,len(images)):
images[i].save(os.path.join(dir_path,'png/test'+str(i).zfill(8)+'.png'), 'png')
#以下notebookから実行
import glob
import os
dir_path = 'C:\\Users\\user\\Desktop\\topdf'
png_data = glob.glob(os.path.join(dir_path,'png','*.png'))
画像がちゃんと読み込めるか確認
スタンプとして設定したい画像をim2とする
from PIL import Image, ImageDraw, ImageFilter
im1 = Image.open(png_data[0])
im2 = Image.open(os.path.join(dir_path,'stamp','stamp.png'))
スタンプ画像のサイズの確認や、画像の拡大を行う
画像上にpasteで貼り付ける時、その座標も調整しておく
im2.size
back_im = im1.copy()
back_im.paste(im2.resize((216, 72)), (10, 5))
調整が終わったら一括複数に貼り付ける
ファイルサイズも気になるのでjpgに設定
for o in range(0,len(png_data)):
im1 = Image.open(png_data[o])
im2 = Image.open(os.path.join(dir_path,'stamp','stamp.png'))
back_im = im1.copy()
back_im.paste(im2.resize((216, 72)), (10, 5))
back_im.save(os.path.join(dir_path,'png_stamped',str(o).zfill(8)+'.jpg'),
quality=10)
img2pdfを使ってpdf化していく
import img2pdf
fname =os.path.join(dir_path,'pdf',"output.pdf")
dirname = os.path.join(dir_path,'png_stamped')
with open(fname,"wb") as f:
imgs = []
for fname in os.listdir(dirname):
if not fname.endswith(".jpg"):
continue
path = os.path.join(dirname, fname)
if os.path.isdir(path):
continue
imgs.append(path)
f.write(img2pdf.convert(imgs))
pdfフォルダにpdfファイルが作成される
#以上
いや、acrobat買えよ。
#参考