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

如何用Pandoc Haskell库从XML字符串生成PDF?修复LaTeX报错

解决Pandoc转换XML到PDF时的LaTeX错误:Missing \begin{document}

问题背景

需要将给定的XML格式字符串转换为PDF文件,使用Pandoc的readHtml读取HTML格式的XML,makePDF生成PDF,但运行时出现LaTeX编译错误:

! LaTeX Error: Missing \begin{document}.
See the LaTeX manual or LaTeX Companion for explanation.

Type H for immediate help.

...

l.1 -

错误原因分析

  1. 缺失g函数定义:代码中调用了g xmlString但未实现该函数,g本应是封装readHtml的HTML读取逻辑。
  2. 中间格式选择错误:makePDF需要传入能生成LaTeX源码的writer(pdflatex仅能编译LaTeX内容),但代码中使用了writeMarkdown,导致传给pdflatex的是Markdown文本,pdflatex无法识别,因此抛出缺少文档环境的错误。

解决方案

  1. 补充g函数定义,使用readHtml def读取HTML格式的XML字符串。
  2. 将export函数中的writeMarkdown替换为writeLaTeX,确保生成pdflatex可识别的LaTeX源码。
  3. 优化错误处理逻辑,贴合Pandoc原生的错误处理流程。

修正后的完整代码

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Monad
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text as T
import Text.Pandoc
import Text.Pandoc.PDF
import Control.Monad.Catch

xmlString :: T.Text
xmlString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<html>\n  <head>\n    <meta charset=\"utf-8\"/>\n  </head>\n  <body>\n    <ul id=\"a8_boYDC\">\n      <li id=\"rp\">\n        <p>\"Alpha\"</p>\n        <ul>\n          <li id=\"cT\">\n            <p>\"Beta\"</p>\n            <ul>\n              <li id=\"wy\">\n                <p>\"Gamma\"</p>\n              </li>\n              <li id=\"Be\">\n                <p>\"Delta\"</p>\n              </li>\n              <li id=\"Ep\">\n                <p>\"Epsilon\"</p>\n              </li>\n            </ul>\n          </li>\n          <li id=\"Ko\">\n            <p>\"Zeta\"</p>\n            <ul>\n              <li id=\"AI\">\n                <p>\"Eta\"</p>\n              </li>\n            </ul>\n          </li>\n          <li id=\"kw\">\n            <p>\"Theta\"</p>\n            <ul>\n              <li id=\"sx\">\n                <p>\"Iota\"</p>\n              </li>\n              <li id=\"82\">\n                <p>\"Kappa\"</p>\n              </li>\n              <li id=\"o_\">\n                <p>\"Lambda\"</p>\n              </li>\n            </ul>\n          </li>\n        </ul>\n      </li>\n    </ul>\n  </body>\n</html>\n"

-- 定义HTML读取函数
g :: T.Text -> PandocIO Pandoc
g = readHtml def

export :: (PandocMonad m, MonadIO m, MonadMask m) => Pandoc -> m (Either BL.ByteString BL.ByteString)
-- 使用writeLaTeX生成LaTeX源码,供pdflatex编译
export = makePDF "pdflatex" [] writeLaTeX def

main :: IO ()
main = do
  result <- runIO $ do
    doc <- g xmlString
    export doc
  case result of
    Right (Right pdfBytes) -> BL.writeFile "output.pdf" pdfBytes
    Right (Left errLog)    -> BL.putStr errLog
    Left pandocErr         -> print pandocErr

额外说明

  • 确保系统中pdflatex已正确安装且可在PATH中访问。
  • 修正后的代码简化了错误处理流程,避免了不必要的IO嵌套,逻辑更清晰。

内容的提问来源于stack exchange,提问作者F. Zer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 18:50:41