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)