generated from container/tmpl
Julin
1 year ago
6 changed files with 229 additions and 24 deletions
@ -0,0 +1,110 @@ |
|||||
|
import platform |
||||
|
import os |
||||
|
import fitz # pip install PyMuPDF |
||||
|
from PIL import Image |
||||
|
import shutil |
||||
|
import logging |
||||
|
|
||||
|
|
||||
|
# 将word文件转换成pdf文件 |
||||
|
def word2pdf(word_file): |
||||
|
from win32com import client # pip install pywin32 |
||||
|
|
||||
|
# 获取word格式处理对象 |
||||
|
word = client.Dispatch('Word.Application') |
||||
|
# 以Doc对象打开文件 |
||||
|
doc_ = word.Documents.Open(word_file) |
||||
|
# 另存为pdf文件 |
||||
|
pdf_file = word_file.replace(os.path.basename(word_file).split('.')[1], "pdf") |
||||
|
doc_.SaveAs(pdf_file, FileFormat=17) |
||||
|
logging.info(f'{word_file} ----转pdf成功') |
||||
|
# 关闭doc对象 |
||||
|
doc_.Close() |
||||
|
# 退出word对象 |
||||
|
word.Quit() |
||||
|
return pdf_file |
||||
|
|
||||
|
|
||||
|
# 将word文件转换成pdf文件(Linux) |
||||
|
def word2pdf_linux(word_file): |
||||
|
word_path = os.path.dirname(word_file) |
||||
|
os.system(f"libreoffice --headless --language=zh-CN --convert-to pdf {word_file} --outdir {word_path}") |
||||
|
logging.info(f'{word_file} ----转pdf成功') |
||||
|
pdf_file = word_file.replace(os.path.basename(word_file).split('.')[1], "pdf") |
||||
|
return pdf_file |
||||
|
|
||||
|
|
||||
|
# pdf转图片 |
||||
|
def pdf2png(pdf_file): |
||||
|
image_path = os.path.abspath(f'{os.path.dirname(pdf_file)}/tmp_pdf2png') |
||||
|
try: |
||||
|
# 创建一个空白图片,用于拼接内容 |
||||
|
width, height = 0, 0 |
||||
|
images = [] |
||||
|
|
||||
|
pdf_doc = fitz.open(pdf_file) |
||||
|
for pg in range(pdf_doc.page_count): |
||||
|
page = pdf_doc[pg] |
||||
|
rotate = int(0) |
||||
|
# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。 |
||||
|
# 此处若是不做设置,默认图片大小为:792X612, dpi=96 |
||||
|
zoom_x = 1.33333333 # (1.33333333-->1056x816) (2-->1584x1224) |
||||
|
zoom_y = 1.33333333 |
||||
|
mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate) |
||||
|
pix = page.get_pixmap(matrix=mat, alpha=False) |
||||
|
|
||||
|
if not os.path.exists(image_path): # 判断存放图片的文件夹是否存在 |
||||
|
os.makedirs(image_path) # 若图片文件夹不存在就创建 |
||||
|
pix.save(image_path + '/' + 'tmp%s.png' % pg) # 将图片写入指定的文件夹内 |
||||
|
|
||||
|
img = Image.open(image_path + '/' + 'tmp%s.png' % pg) |
||||
|
img_width, img_height = img.size |
||||
|
|
||||
|
# 更新拼接图片的宽度和高度 |
||||
|
width = max(width, img_width) |
||||
|
height += img_height |
||||
|
|
||||
|
# 添加图片到拼接列表 |
||||
|
images.append(img) |
||||
|
|
||||
|
# 创建一个空白长图 |
||||
|
long_image = Image.new('RGB', (width, height), (255, 255, 255)) |
||||
|
y_offset = 0 |
||||
|
|
||||
|
# 将每张图片拼接到长图中 |
||||
|
for img in images: |
||||
|
long_image.paste(img, (0, y_offset)) |
||||
|
y_offset += img.height |
||||
|
|
||||
|
# 保存拼接后的长图 |
||||
|
png_file = pdf_file.replace(os.path.basename(pdf_file).split('.')[1], "png") |
||||
|
long_image.save(png_file) |
||||
|
|
||||
|
# 删除中间临时保存的图片 |
||||
|
shutil.rmtree(image_path) |
||||
|
except IOError as error: |
||||
|
logging.error('pdf转png失败') |
||||
|
raise error |
||||
|
else: |
||||
|
logging.info("pdf转png成功") |
||||
|
return png_file |
||||
|
|
||||
|
|
||||
|
def word_to_long_image(word_file_path): |
||||
|
try: |
||||
|
_file = os.path.abspath(word_file_path) # os.path.abspath('input.docx') |
||||
|
|
||||
|
if platform.system().lower() == 'windows': |
||||
|
pdf_file = word2pdf(_file) |
||||
|
else: |
||||
|
pdf_file = word2pdf_linux(_file) |
||||
|
|
||||
|
png_file = pdf2png(pdf_file) |
||||
|
|
||||
|
# 删除中间保存的pdf文件 |
||||
|
os.remove(pdf_file) |
||||
|
|
||||
|
return png_file |
||||
|
except Exception as error: |
||||
|
logging.error('word转长图出错:{}'.format(error)) |
||||
|
raise error |
Loading…
Reference in new issue