如何用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 -
错误原因分析
- 缺失
g函数定义:代码中调用了g xmlString但未实现该函数,g本应是封装readHtml的HTML读取逻辑。 - 中间格式选择错误:
makePDF需要传入能生成LaTeX源码的writer(pdflatex仅能编译LaTeX内容),但代码中使用了writeMarkdown,导致传给pdflatex的是Markdown文本,pdflatex无法识别,因此抛出缺少文档环境的错误。
解决方案
- 补充
g函数定义,使用readHtml def读取HTML格式的XML字符串。 - 将
export函数中的writeMarkdown替换为writeLaTeX,确保生成pdflatex可识别的LaTeX源码。 - 优化错误处理逻辑,贴合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
相关产品推荐
相关产品推荐

