You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用pypandoc转换RTF到PDF时页面格式变更问题求助

使用pypandoc转换RTF到PDF时页面格式变更问题求助

大家好,我最近在用pypandoc做RTF转PDF的转换,结果碰到个头疼的问题——转换后的PDF页面格式和原RTF完全对不上!后来发现是因为pypandoc底层用LaTeX生成PDF,直接套用了LaTeX的默认排版规则,导致原文件的边距、段落对齐、行间距这些细节全乱了。

先给大家看看我目前用的代码:

import pypandoc
def rtf_to_pdf(input_file, output_file):
    """
    Convert an RTF file to PDF using pypandoc.
    
    Args:
    input_file (str): Path to the input RTF file.
    output_file (str): Path where the output PDF will be saved.
    """
    try:
        output = pypandoc.convert_file(input_file, 'pdf', outputfile=output_file)
        print(f"Conversion successful! PDF saved as {output_file}")
        return output
    except Exception as e:
        print(f"An error occurred: {e}")

# Example usage
rtf_to_pdf('input_file.rtf', 'output_file.pdf')

我试了好几次,转换后的PDF完全没保留原RTF的排版细节:原本设置的窄边距变成了LaTeX默认的宽边距,段落原本的右对齐变成了左对齐,行间距也明显不一样。有没有大佬能指点下,怎么让转换后的PDF尽量贴近原RTF的格式?

我自己查资料整理的几个可能解决方向,供大家参考:

  • 自定义LaTeX模板:既然底层用LaTeX,那我们可以自己写LaTeX模板来覆盖默认设置。比如先创建一个custom_template.tex文件,里面定义好和原RTF匹配的边距、行间距、字体等参数:
\documentclass{article}
\usepackage[margin=10mm]{geometry} % 这里设置和原RTF一致的边距
\usepackage{setspace}
\setstretch{1.2} % 匹配原文件行间距
\usepackage{ragged2e} % 用于自定义对齐方式
\begin{document}
$body$
\end{document}

然后修改Python代码,在转换时指定这个模板:

output = pypandoc.convert_file(input_file, 'pdf', outputfile=output_file,
                               extra_args=['--template=custom_template.tex'])
  • 先转HTML再转PDF:如果觉得LaTeX模板太麻烦,可以换个思路——先把RTF转成HTML(RTF到HTML的格式保留通常更精准),再把HTML转成PDF。这种方式可以用wkhtmltopdf来控制页面参数,代码修改如下:
import pypandoc
def rtf_to_pdf(input_file, output_file):
    try:
        # 第一步:RTF转HTML
        pypandoc.convert_file(input_file, 'html', outputfile='temp_convert.html')
        # 第二步:HTML转PDF,用wkhtmltopdf控制格式
        extra_args = [
            '--wkhtmltopdf-opt', '--margin-top=10mm',
            '--wkhtmltopdf-opt', '--margin-bottom=10mm',
            '--wkhtmltopdf-opt', '--margin-left=10mm',
            '--wkhtmltopdf-opt', '--margin-right=10mm'
        ]
        pypandoc.convert_file('temp_convert.html', 'pdf', outputfile=output_file, extra_args=extra_args)
        print(f"Conversion successful! PDF saved as {output_file}")
    except Exception as e:
        print(f"An error occurred: {e}")

注意这种方法需要提前安装wkhtmltopdf工具,不然pypandoc调用不了。

  • 用专用RTF转PDF工具:如果上面两种方法都达不到预期,不如跳过pypandoc,直接用专门处理RTF的工具,比如unoconv(需要依赖LibreOffice)。它能直接读取RTF的格式信息转成PDF,保留度更高。在Python里可以用subprocess调用它的命令:
import subprocess
def rtf_to_pdf(input_file, output_file):
    try:
        subprocess.run(['unoconv', '-f', 'pdf', '-o', output_file, input_file], check=True)
        print(f"Conversion successful! PDF saved as {output_file}")
    except subprocess.CalledProcessError as e:
        print(f"An error occurred: {e}")

这个方法需要先安装LibreOffice和unoconv,不过格式保留的效果通常是最好的。

备注:内容来源于stack exchange,提问作者youta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:58:04