PDF 转 PPTX

用途

beamer 生成的 PDF 转 PPTX
marp 导出的 PDF 转 PPTX
PPTX 导出的 PDF 再转为高清图片档 PPTX

过程

将 PDF 文档导出为 PNG 图片,每页一张。
每张 PNG 作为一张 slide,做成一个 PPTX 文档。

安装

需安装

python-pptxpip install python-pptx
pymupdfpip 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-pptxpip 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 添加新版本

Published by

风君子

独自遨游何稽首 揭天掀地慰生平