2015-12-27 55 views
4

我正在使用的項目的一部分涉及使用Pandoc創建PDF。我擁有製作PDF的程序部分。要弄清楚如何做到這一點,我試圖從JGM BayHack 2014修改fuel.hs使用pandoc作爲庫來製作PDF

但是,我有困難。我有以下功能:

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。


回答

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" 

爲了得到一個模板,你可以在獨立模式下使用Pandoc從shell:

pandoc -D latex > template.tex

而且,有可能是Pandoc安裝問題使用堆棧,使用cabal,並使用系統包管理器,找到默認模板。我不確定所有這些如何相互作用。


完全包含的要點here