87 lines
3.0 KiB
Python
87 lines
3.0 KiB
Python
from odoo import http
|
|
import logging
|
|
import os
|
|
import json
|
|
import sys
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
class Main(http.Controller):
|
|
@http.route('/api/pdf2image', type='http', auth='public', methods=['POST'], csrf=False)
|
|
def convert_pdf_to_image(self, **kwargs):
|
|
"""将PDF文件转换为图片文件
|
|
|
|
Returns:
|
|
dict: 包含转换后图片url的字典
|
|
"""
|
|
res = {}
|
|
try:
|
|
# 检查poppler是否可用
|
|
# if sys.platform.startswith('win'):
|
|
# if not os.environ.get('POPPLER_PATH'):
|
|
# return {
|
|
# 'code': 400,
|
|
# 'msg': '请先配置POPPLER_PATH环境变量'
|
|
# }
|
|
# else:
|
|
# import shutil
|
|
# if not shutil.which('pdftoppm'):
|
|
# return {
|
|
# 'code': 400,
|
|
# 'msg': '请先安装poppler-utils'
|
|
# }
|
|
|
|
# 获取上传的PDF文件
|
|
pdf_file = kwargs.get('file')
|
|
if not pdf_file:
|
|
res = {'code': 400, 'msg': '未找到上传的PDF文件'}
|
|
|
|
# 检查文件类型
|
|
if not pdf_file.filename.lower().endswith('.pdf'):
|
|
res = {'code': 400, 'msg': '请上传PDF格式的文件'}
|
|
|
|
# 读取PDF文件内容
|
|
pdf_content = pdf_file.read()
|
|
|
|
# 使用pdf2image转换
|
|
from pdf2image import convert_from_bytes
|
|
import tempfile
|
|
|
|
# 转换PDF
|
|
with tempfile.TemporaryDirectory() as path:
|
|
images = convert_from_bytes(pdf_content)
|
|
image_urls = []
|
|
|
|
# 保存每一页为图片
|
|
for i, image in enumerate(images):
|
|
image_path = os.path.join(path, f'page_{i+1}.jpg')
|
|
image.save(image_path, 'JPEG')
|
|
|
|
# 将图片保存到ir.attachment
|
|
with open(image_path, 'rb') as img_file:
|
|
attachment = http.request.env['ir.attachment'].sudo().create({
|
|
'name': f'page_{i+1}.jpg',
|
|
'datas': img_file.read(),
|
|
'type': 'binary',
|
|
'access_token': kwargs.get('access_token') or '123'
|
|
})
|
|
image_urls.append({
|
|
'page': i+1,
|
|
'url': f'/web/content/{attachment.id}'
|
|
})
|
|
|
|
res = {
|
|
'code': 200,
|
|
'msg': '转换成功',
|
|
'data': image_urls
|
|
}
|
|
|
|
except Exception as e:
|
|
_logger.error('PDF转换失败: %s', str(e))
|
|
res = {
|
|
'code': 500,
|
|
'msg': f'转换失败: {str(e)}'
|
|
}
|
|
return json.JSONEncoder().encode(res)
|
|
|