使用pandoc作为库来制作PDF

时间:2015-12-27 20:35:40

标签: haskell pandoc

我正在处理的项目的一部分涉及使用Pandoc创建PDF。我有程序的一部分制作PDF。要弄清楚如何执行此操作,我尝试从JGM BayHack 2014修改fuel.hs

然而,我遇到了困难。我有以下功能:

export :: (MonadIO m) => Pandoc -> m (Either BL.ByteString BL.ByteString)
export = liftIO . makePDF "xelatex" writeLaTeX  def { writerStandalone = True } 

在我修改过的fuel.hs的主体中,

  pdfbytes <- export letter
  print pdfbytes

我得到以下输出:

$ stack runghc fuel.hs
Run from outside a project, using implicit global project config
Using resolver: lts-3.7 from implicit global project's config file: /home/stevejb/.stack/global/stack.yaml
Left "! Emergency stop.\n<*> /tmp/tex2pdf.8283/input.tex\n                               \nNo pages of output.\nTranscript written on /tmp/tex2pdf.8283/input.log.\n"
"Fail"

但是,正在引用的日志文件不存在。我不知道如何调试这个。我安装了xelatex。

1 个答案:

答案 0 :(得分:9)

在#haskell IRC的帮助下,我能够让它运转起来。关键是添加我自己的LaTeX模板。因此,可以使用以下内容:

export :: (MonadIO m) => String ->  Pandoc -> m (Either BL.ByteString BL.ByteString)
export tmpl pdoc = liftIO $ makePDF "xelatex" writeLaTeX (def { writerStandalone = True, writerTemplate = tmpl}) pdoc

getLetter  = do
  json <- BL.readFile "cng_fuel_chicago.json"
  let letter = case decode json of
                    Just stations -> createLetter [s | s <- stations,
                                        "Voyager" `elem` cardsAccepted s]
                    Nothing       -> error "Could not decode JSON"
  return $ letter


main :: IO ()
main = do
  letter <- getLetter
  temp <- readFile "template.tex"
  let str_should_have_something = writeLaTeX (def {writerStandalone = True, writerTemplate = temp}) letter
  print str_should_have_something
  mybytes <- export temp letter

  case mybytes of Right b -> BL.writeFile "mypdf.pdf" b
                  Left  _ -> putStrLn "Export error"

要获取模板,您可以在shell中以独立模式使用Pandoc:

pandoc -D latex > template.tex

此外,在查找默认模板方面,使用堆栈,使用cabal和使用系统包管理器安装Pandoc可能存在问题。我不确定所有这些是如何相互作用的。

完全包含的要点here