当前位置:  开发笔记 > 编程语言 > 正文

使用pandoc作为库来制作PDF

如何解决《使用pandoc作为库来制作PDF》经验,为你挑选了1个好方法。

我正在研究的项目的一部分涉及使用Pandoc创建PDF.我有程序的一部分制作PDF.为了弄清楚如何做到这一点,我试图fuel.hs从JGM BayHack 2014进行修改.

但是,我遇到了困难.我有以下功能:

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.


stevejb.. 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的问题.我不确定所有这些是如何相互作用的.


完全包含在这里的要点.



1> stevejb..:

在#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的问题.我不确定所有这些是如何相互作用的.


完全包含在这里的要点.

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有