用途
beamer 生成的 PDF 转 PPTX
marp 导出的 PDF 转 PPTX
PPTX 导出的 PDF 再转为高清图片档 PPTX
过程
将 PDF 文档导出为 PNG 图片,每页一张。
每张 PNG 作为一张 slide,做成一个 PPTX 文档。
安装
需安装
python-pptx,pip install python-pptx
pymupdf,pip install pymupdf
使用
用法:python pdf_to_pptx.py test.pdf {RATIO} {ZOOM-FACTOR}
,
其中 {RATIO}
表示 PDF 页面的宽高比例,{ZOOM-FACTOR}
控制图片清晰度。
如
python pdf_to_pptx.py test.pdf 4:3 5
或
python pdf_to_pptx.py test.pdf 16:9 10
代码
pdf_to_pptx.py
# encoding: UTF-8
# pip install python-pptx
# https://python-pptx.readthedocs.io/
# pip install pymupdf
# https://pymupdf.readthedocs.io/en/latest/
import sys, math, io
from pptx import Presentation
from pptx.util import Inches
from pptx.parts.image import Image
import fitz
# args: pdf_filename, aspect_ratio, zoom_factor
pdf_filename = sys.argv[1]
width, height = listmapint, sys.argv[2].split':')))
zoom_factor = intsys.argv[3])
prs = Presentation)
prs.slide_width = Incheswidth)
prs.slide_height = Inchesheight)
blank_slide_layout = prs.slide_layouts[6]
mat = fitz.Matrixzoom_factor, zoom_factor) # zoom factor in each dimension
doc = fitz.openpdf_filename) # open document
print'#pages', lendoc))
for i, page in enumeratedoc): # iterate through the pages
pix = page.getPixmapmatrix = mat, alpha=False) # use 'mat' instead of the identity matrix
png_data = pix.getImageData'png')
tmp_file = io.BytesIOpng_data)
slide = prs.slides.add_slideblank_slide_layout)
pic = slide.shapes.add_picturetmp_file, 0, 0, width=prs.slide_width)
print'page {}, image size: {}, {})'.formati+1, pix.width, pix.height))
pptx_filename = pdf_filename.replace'.pdf', '_converted.pptx')
prs.savepptx_filename)
print'saved to', pptx_filename)
旧版本
安装及使用
需安装
python-pptx,pip install python-pptx
pdftk
pdftoppm
用法:python pdf_to_pptx.py test.pdf {RATIO} {DPI}
,
其中 {RATIO}
表示 PDF 页面的宽高比例,{DPI}
表示图片 DPI,控制图片清晰度。
如
python pdf_to_pptx.py test.pdf 4:3 500
或
python pdf_to_pptx.py test.pdf 16:9 1000
代码
pdf_to_pptx.py
# encoding: UTF-8
# pip install python-pptx
# https://python-pptx.readthedocs.io/
# need pdftk, pdftoppm installed
import sys
import os
import re
import math
from pptx import Presentation
from pptx.util import Inches
from pptx.parts.image import Image
# args: pdf_filename, aspect_ratio, dpi
pdf_filename = sys.argv[1]
width, height = listmapint, sys.argv[2].split':')))
dpi = intsys.argv[3])
tmp_dir = 'png_tmps'
os.system'mkdir -p {}'.formattmp_dir))
# dump pdf meta-data to get number of pages
os.system'pdftk {} dump_data_utf8 output {}/data.txt'.formatpdf_filename, tmp_dir))
data_content = open'{}/data.txt'.formattmp_dir)).read)
groups = re.findall'NumberOfPages: d+)', data_content)
page_num = intgroups[0])
print'#pages:', page_num)
prs = Presentation)
prs.slide_width = Incheswidth)
prs.slide_height = Inchesheight)
# _ = math.gcdprs.slide_width, prs.slide_height)
# print'PPT Aspect Ratio: {}/{}'.formatprs.slide_width//_, prs.slide_height//_))
blank_slide_layout = prs.slide_layouts[6]
for i in range1, page_num+1):
os.system'pdftoppm {0} {1}/{2} -png -f {2} -singlefile -r {3}'.formatpdf_filename, tmp_dir, i, dpi))
img_path = '{}/{}.png'.formattmp_dir, i)
img = Image.from_fileimg_path)
slide = prs.slides.add_slideblank_slide_layout)
pic = slide.shapes.add_pictureimg_path, 0, 0, width=prs.slide_width)
img_width, img_height = img.size
_ = math.gcdimg_width, img_height)
printi, img.size, '{}:{}'.formatimg_width//_, img_height//_))
pptx_filename = pdf_filename.replace'.pdf', '_converted.pptx')
prs.savepptx_filename)
print'saved to', pptx_filename)
END
2020.5.10 晚 22:13
2020.6.14 晚 21:08 添加新版本