# import io
# import re
# import subprocess
# import sys
#
# import mammoth
# import pdfkit
# from bs4 import BeautifulSoup
# from django.http import  JsonResponse
# from pdf2docx import Converter
# from DCbackend.utils import common
# from DCbackend.utils.common import success, fail
# import os
# from datetime import datetime
# class ExportService:
#
#     @staticmethod
#     def Export(request):
#         html_content = request.POST.get("content", "<h1>Test Content</h1>")
#
#         # 预处理 HTML 内容，将特定格式转换为标题
#         def process_content(content):
#             # 使用正则表达式匹配 A{{Directory1}}, A.1{{Directory2}} 等格式
#             pattern = r'([A-Z](?:\.\d+)*){{Directory(\d+)}}'
#
#             def replace_with_header(match):
#                 prefix = match.group(1)
#                 level = int(match.group(2))
#                 # 确保标题级别在1到6之间
#                 level = max(1, min(level, 6))
#                 return f'<h{level}>{prefix}'
#
#             # 替换匹配的内容为HTML标题
#             processed_content = re.sub(pattern, replace_with_header, content)
#             return processed_content
#
#         processed_html_content = process_content(html_content)
#
#         output_dir = 'uploads'
#         input_file = 'input.html'
#
#         # 使用当前时间生成唯一的文件名
#         current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
#         output_file = f'exported_document_{current_time}.docx'
#
#         input_path = os.path.join(output_dir, input_file)
#         output_path = os.path.join(output_dir, output_file)
#
#         print(f"准备创建输入文件: {input_path}")
#
#         try:
#             # 确保输出目录存在
#             os.makedirs(output_dir, exist_ok=True)
#
#             # 写入处理后的 HTML 内容到输入文件
#             with open(input_path, 'w', encoding='utf-8') as f:
#                 f.write(processed_html_content)
#
#             print(f"输入文件成功创建: {input_path}")
#
#             if sys.platform.startswith('win'):
#                 pandoc_path = r'D:\Download\pandoc-3.1.12.2\pandoc.exe'
#             else:
#                 pandoc_path = '/usr/local/bin/pandoc'
#             command = [
#                 pandoc_path,
#                 "-f", "html",
#                 "-t", "docx",
#                 "--toc",  # 生成目录
#                 "--toc-depth=6",  # 目录深度，设置为6以包含所有可能的级别
#                 "--number-sections",  # 为标题添加编号
#                 "-o", output_path,
#                 input_path
#             ]
#
#             print("开始执行 Pandoc 转换")
#             result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
#
#             if result.returncode == 0:
#                 print(f"Pandoc 转换成功，输出文件: {output_path}")
#                 if os.path.exists(output_path):
#                     oss_url = common.oss_upload_file(output_path)
#                     file_size = os.path.getsize(output_path)
#                     return success({
#                         "file_name": output_file,
#                         "file_path": oss_url,
#                         "file_size": file_size
#                     })
#                 else:
#                     return JsonResponse({"error": "DOCX 文件创建失败，无法找到文件"}, status=500)
#             else:
#                 print(f"Pandoc 转换失败。错误信息: {result.stderr.decode()}")
#                 return JsonResponse({"error": f"Pandoc 转换失败: {result.stderr.decode()}"}, status=500)
#
#         except Exception as e:
#             print(f"处理过程中发生错误: {str(e)}")
#             return JsonResponse({"error": f"处理过程中发生错误: {str(e)}"}, status=500)
#         finally:
#             # 清理输入文件
#             if os.path.exists(input_path):
#                 os.remove(input_path)
#                 print(f"已删除输入文件: {input_path}")
#
#     @staticmethod
#     def htmlPDFWord(request):
#         html_content = request.POST.get("content", "<h1>Test Content</h1>")
#
#         # 创建一个临时目录来存储生成的文件
#         output_dir = 'temp_files'
#         os.makedirs(output_dir, exist_ok=True)
#
#         # 生成唯一的文件名
#         current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
#         pdf_file = f'exported_document_{current_time}.pdf'
#         docx_file = f'exported_document_{current_time}.docx'
#         pdf_path = os.path.join(output_dir, pdf_file)
#         docx_path = os.path.join(output_dir, docx_file)
#
#         try:
#             # 配置pdfkit选项
#             options = {
#                 'page-size': 'A4',
#                 'margin-top': '0.75in',
#                 'margin-right': '0.75in',
#                 'margin-bottom': '0.75in',
#                 'margin-left': '0.75in',
#                 'encoding': "UTF-8",
#             }
#
#             # 指定wkhtmltopdf的路径
#             if sys.platform.startswith('win'):
#                 config = pdfkit.configuration(wkhtmltopdf=r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')
#             else:
#                 config = pdfkit.configuration(wkhtmltopdf='/usr/local/bin/wkhtmltopdf')
#
#             # 将HTML转换为PDF
#             pdfkit.from_string(html_content, pdf_path, options=options, configuration=config)
#
#             # 将PDF转换为DOCX
#             cv = Converter(pdf_path)
#             cv.convert(docx_path)
#             cv.close()
#
#             # 上传到阿里云OSS
#             oss_url = common.oss_upload_file(docx_path)
#
#             # 获取文件大小
#             file_size = os.path.getsize(docx_path)
#
#             # 返回成功响应，包含文件信息
#             return success({
#                 "file_name": docx_file,
#                 "file_path": oss_url,
#                 "file_size": file_size
#             })
#
#         except Exception as e:
#             return fail(f"文档生成或上传失败: {str(e)}")
#
#         finally:
#             # 清理临时文件
#             if os.path.exists(pdf_path):
#                 os.remove(pdf_path)
#             if os.path.exists(docx_path):
#                 os.remove(docx_path)
#             # 尝试删除临时目录
#             try:
#                 os.rmdir(output_dir)
#             except OSError:
#                 # 如果目录不为空，就忽略错误
#                 pass
#
#     @staticmethod
#     def htmlPDF(request):
#         html_content = request.POST.get("content", "<h1>Test Content</h1>")
#
#         # 创建一个临时目录来存储生成的PDF
#         output_dir = 'temp_pdf'
#         os.makedirs(output_dir, exist_ok=True)
#
#         # 生成唯一的文件名
#         current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
#         output_file = f'exported_document_{current_time}.pdf'
#         output_path = os.path.join(output_dir, output_file)
#
#         try:
#             # 配置pdfkit选项
#             # 调整选项以放大内容
#             options = {
#                 'page-size': 'A4',
#                 'margin-top': '0.75in',
#                 'margin-right': '0.75in',
#                 'margin-bottom': '0.75in',
#                 'margin-left': '0.75in',
#                 'encoding': "UTF-8",
#                 'dpi': 300,  # 增加 DPI 以提高清晰度
#             }
#
#             # 指定wkhtmltopdf的路径
#             if sys.platform.startswith('win'):
#                 config = pdfkit.configuration(wkhtmltopdf=r'D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe')
#             else:
#                 config = pdfkit.configuration(wkhtmltopdf='/usr/local/bin/wkhtmltopdf')
#
#             # 将HTML转换为PDF
#             pdfkit.from_string(html_content, output_path, options=options, configuration=config)
#
#             # 上传到阿里云OSS
#             oss_url = common.oss_upload_file(output_path)
#
#             # 获取文件大小
#             file_size = os.path.getsize(output_path)
#
#             # 删除临时文件
#             os.remove(output_path)
#
#             # 返回成功响应，包含文件信息
#             return success({
#                 "file_name": output_file,
#                 "file_path": oss_url,
#                 "file_size": file_size
#             })
#
#         except Exception as e:
#             # 如果出现错误，确保删除任何可能创建的临时文件
#             if os.path.exists(output_path):
#                 os.remove(output_path)
#             return fail(f"PDF生成或上传失败: {str(e)}")
#
#         finally:
#             # 尝试删除临时目录
#             try:
#                 os.rmdir(output_dir)
#             except OSError:
#                 # 如果目录不为空，就忽略错误
#                 pass
#
#     @staticmethod
#     def htmlWord(request):
#         html_content = request.POST.get("content", "<h1>Test Content</h1>")
#
#         # 创建一个内存中的字节流来存储Word文档
#         output = io.BytesIO()
#
#         # 使用mammoth将HTML转换为Word文档
#         style_map = """
#             p => p:fresh
#             h1 => h1:fresh
#             h2 => h2:fresh
#             h3 => h3:fresh
#             h4 => h4:fresh
#             h5 => h5:fresh
#             h6 => h6:fresh
#             strong => b
#             em => i
#             ul => ul
#             ol => ol
#             li => li
#             """
#         mammoth.convert_html_to_docx(html_content, output, style_map=style_map)
#
#         # 生成唯一的文件名
#         current_time = datetime.now().strftime("%Y%m%d_%H%M%S")
#         output_file = f'exported_document_{current_time}.docx'
#         output_dir = 'temp_word'
#         os.makedirs(output_dir, exist_ok=True)
#         output_path = os.path.join(output_dir, output_file)
#
#         try:
#             # 将内存中的文档保存到文件
#             with open(output_path, "wb") as f:
#                 f.write(output.getvalue())
#
#             # 上传到阿里云OSS
#             oss_url = common.oss_upload_file(output_path)
#
#             # 获取文件大小
#             file_size = os.path.getsize(output_path)
#
#             return success({
#                 "file_name": output_file,
#                 "file_path": oss_url,
#                 "file_size": file_size
#             })
#
#         except Exception as e:
#             return fail(f"Word文档生成或上传失败: {str(e)}")
#
#         finally:
#             # 清理临时文件
#             if os.path.exists(output_path):
#                 os.remove(output_path)
#             # 尝试删除临时目录
#             try:
#                 os.rmdir(output_dir)
#             except OSError:
#                 # 如果目录不为空，就忽略错误
#                 pass
#
#
#
#
#
#
#
#
#
#
#
