文档格式转换器。用于Word、PDF、Markdown、HTML格式间的转换。支持docx转pdf、md转pdf、md转docx、html转pdf等。
文档转换器是一项面向实际任务的技能,主要用于高纯度文档格式转换器 支持Word, PDF, Markdown, 和 HTML 格式.;Features QQ Word → PDF: 转换.docx 到 PDF + Markdown → PDF : 转换.md 到 PDF + M。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
高保真文档格式转换工具,支持 Word、PDF、Markdown 和 HTML 格式。
| 源格式 | 目标格式 | 实现方式 |
|---|---|---|
| .docx | python-docx + fpdf2 | |
| .md | markdown + fpdf2 | |
| .md | .docx | markdown + python-docx |
| .html | pdfkit / wkhtmltopdf | |
| .docx | .md | python-docx 提取 |
请提供以下信息: 源文件路径: 目标格式:(pdf/docx/md) 特殊要求:(保持格式/压缩/水印等)
python3 << 'PYEOF'
import os
import sys
from docx import Document
from fpdf import FPDF
class DocxToPdf:
def __init__(self):
self.pdf = FPDF()
self.pdf.set_auto_page_break(auto=True, margin=15)
def convert(self, docx_path, output_path):
"""Convert Word document to PDF"""
doc = Document(docx_path)
self.pdf.add_page()
for para in doc.paragraphs:
if not para.text.strip():
continue
# Determine style
style = para.style.name
if 'Heading 1' in style:
self.pdf.set_font('Helvetica', 'B', 18)
self.pdf.ln(5)
self.pdf.multi_cell(0, 10, para.text)
self.pdf.ln(3)
elif 'Heading 2' in style:
self.pdf.set_font('Helvetica', 'B', 14)
self.pdf.ln(3)
self.pdf.multi_cell(0, 8, para.text)
self.pdf.ln(2)
elif 'Heading 3' in style:
self.pdf.set_font('Helvetica', 'B', 12)
self.pdf.ln(2)
self.pdf.multi_cell(0, 7, para.text)
self.pdf.ln(2)
else:
self.pdf.set_font('Helvetica', '', 11)
self.pdf.multi_cell(0, 6, para.text)
self.pdf.ln(2)
# Handle tables
for table in doc.tables:
self.pdf.ln(5)
self._add_table(table)
self.pdf.output(output_path)
return output_path
def _add_table(self, table):
"""Add table to PDF"""
# Get column widths
num_cols = len(table.columns)
col_width = 190 / num_cols
# Header
self.pdf.set_font('Helvetica', 'B', 10)
self.pdf.set_fill_color(49, 130, 206)
self.pdf.set_text_color(255, 255, 255)
for cell in table.rows[0].cells:
self.pdf.cell(col_width, 8, cell.text, 1, 0, 'C', True)
self.pdf.ln()
# Data rows
self.pdf.set_font('Helvetica', '', 9)
self.pdf.set_text_color(0, 0, 0)
for row in table.rows[1:]:
for cell in row.cells:
self.pdf.cell(col_width, 7, cell.text, 1, 0, 'L')
self.pdf.ln()
# Convert
converter = DocxToPdf()
converter.convert('input.docx', 'output.pdf')
PYEOF
python3 << 'PYEOF'
import os
import markdown
from fpdf import FPDF
class MarkdownToPdf:
def __init__(self):
self.pdf = FPDF()
self.pdf.set_auto_page_break(auto=True, margin=15)
def convert(self, md_path, output_path):
"""Convert Markdown to PDF"""
with open(md_path, 'r', encoding='utf-8') as f:
content = f.read()
# Parse markdown
lines = content.split('\n')
self.pdf.add_page()
for line in lines:
line = line.strip()
if not line:
self.pdf.ln(3)
continue
# Headers
if line.startswith('# '):
self.pdf.set_font('Helvetica', 'B', 20)
self.pdf.ln(5)
self.pdf.multi_cell(0, 10, line[2:])
self.pdf.ln(3)
elif line.startswith('## '):
self.pdf.set_font('Helvetica', 'B', 16)
self.pdf.ln(4)
self.pdf.multi_cell(0, 8, line[3:])
self.pdf.ln(2)
elif line.startswith('### '):
self.pdf.set_font('Helvetica', 'B', 14)
self.pdf.ln(3)
self.pdf.multi_cell(0, 7, line[4:])
self.pdf.ln(2)
# Lists
elif line.startswith('- ') or line.startswith('* '):
self.pdf.set_font('Helvetica', '', 11)
self.pdf.cell(10, 6, '', 0, 0)
self.pdf.multi_cell(0, 6, line[2:])
elif line.startswith('1. '):
self.pdf.set_font('Helvetica', '', 11)
self.pdf.cell(10, 6, '', 0, 0)
self.pdf.multi_cell(0, 6, line[3:])
# Code blocks
elif line.startswith('```'):
self.pdf.set_font('Courier', '', 9)
# Skip code block content
continue
# Regular text
elif not line.startswith('|') and not line.startswith('>'):
self.pdf.set_font('Helvetica', '', 11)
self.pdf.multi_cell(0, 6, line)
self.pdf.ln(1)
self.pdf.output(output_path)
return output_path
# Convert
converter = MarkdownToPdf()
converter.convert('input.md', 'output.pdf')
PYEOF
python3 << 'PYEOF'
import os
import markdown
from docx import Document
from docx.shared import Pt, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
class MarkdownToDocx:
def __init__(self):
self.doc = Document()
def convert(self, md_path, output_path):
"""Convert Markdown to Word"""
with open(md_path, 'r', encoding='utf-8') as f:
content = f.read()
lines = content.split('\n')
in_code_block = False
for line in lines:
line = line.strip()
if not line:
continue
# Code blocks
if line.startswith('```'):
in_code_block = not in_code_block
continue
if in_code_block:
p = self.doc.add_paragraph()
run = p.add_run(line)
run.font.name = 'Courier New'
run.font.size = Pt(9)
continue
# Headers
if line.startswith('# '):
self.doc.add_heading(line[2:], level=1)
elif line.startswith('## '):
self.doc.add_heading(line[3:], level=2)
elif line.startswith('### '):
self.doc.add_heading(line[4:], level=3)
# Lists
elif line.startswith('- ') or line.startswith('* '):
self.doc.add_paragraph(line[2:], style='List Bullet')
elif line.startswith('1. '):
self.doc.add_paragraph(line[3:], style='List Number')
# Bold/Italic
elif '**' in line:
p = self.doc.add_paragraph()
parts = line.split('**')
for i, part in enumerate(parts):
if part:
run = p.add_run(part)
if i % 2 == 1:
run.bold = True
# Regular text
else:
self.doc.add_paragraph(line)
self.doc.save(output_path)
return output_path
# Convert
converter = MarkdownToDocx()
converter.convert('input.md', 'output.docx')
PYEOF
python3 << 'PYEOF'
import os
import subprocess
class HtmlToPdf:
def convert(self, html_path, output_path):
"""Convert HTML to PDF using wkhtmltopdf"""
# Check if wkhtmltopdf is installed
try:
subprocess.run(['wkhtmltopdf', '--version'],
capture_output=True, check=True)
except FileNotFoundError:
print("❌ wkhtmltopdf not installed")
print("Install: brew install wkhtmltopdf (macOS)")
print(" sudo apt install wkhtmltopdf (Linux)")
return None
# Convert
cmd = [
'wkhtmltopdf',
'--enable-local-file-access',
'--page-size', 'A4',
'--margin-top', '20mm',
'--margin-bottom', '20mm',
'--margin-left', '20mm',
'--margin-right', '20mm',
html_path,
output_path
]
result = subprocess.run(cmd, capture_output=True, text=True)
if result.returncode == 0:
return output_path
else:
print(f"❌ Conversion failed: {result.stderr}")
return None
# Convert
converter = HtmlToPdf()
converter.convert('input.html', 'output.pdf')
PYEOF
def detect_conversion_type(source_path, target_path):
"""Detect conversion type from file extensions"""
source_ext = os.path.splitext(source_path)[1].lower()
target_ext = os.path.splitext(target_path)[1].lower()
conversions = {
('.docx', '.pdf'): 'docx_to_pdf',
('.md', '.pdf'): 'md_to_pdf',
('.md', '.docx'): 'md_to_docx',
('.html', '.pdf'): 'html_to_pdf',
('.docx', '.md'): 'docx_to_md',
}
return conversions.get((source_ext, target_ext))
PDF_SETTINGS = {
'high': {
'dpi': 300,
'quality': 95,
'compress': False
},
'medium': {
'dpi': 150,
'quality': 85,
'compress': True
},
'low': {
'dpi': 72,
'quality': 70,
'compress': True
}
}
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 134.1万人学习
共49课时 | 82.6万人学习