/
pdf.go
105 lines (90 loc) · 2.39 KB
/
pdf.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"bytes"
"exec"
"path/filepath"
"http"
"io/ioutil"
"log"
"os"
"strings"
"url"
)
const PANDOC_DIR = "pandoc"
func PDFServer(w http.ResponseWriter, req *http.Request) {
filename := draftFilename(req)
//iconv := exec.Command("iconv", "-f", "utf-16", "-t", "utf-8", filename)
// try automatic reencoding
// Writer for mac defaults to UTF-8 encoding, while
// Writer for iPad only uses UTF-16
iconv := exec.Command("iconv", "-t", "utf-8", filename)
// I will make sure and force mac to UTF-16
iconv_out, err := iconv.Output()
if err != nil {
log.Fatal("pdfserver iconv_out:", err)
}
tmpdir, err := ioutil.TempDir("tmp/", "")
if err != nil {
log.Fatal("pdfserver tmpdir:", err)
}
//defer os.RemoveAll(tmpdir)
log.Println("Rendering to:", tmpdir)
// Place a symlink to the style file in the temp dir
pandocdir, err := filepath.Abs(PANDOC_DIR)
if err != nil {
log.Fatal("pdfserver pandocdir:", err)
}
stylefilepath := filepath.Join(pandocdir, "article.cls")
tempstylefile := filepath.Join(tmpdir, "article.cls")
os.Symlink(stylefilepath, tempstylefile)
template, err := filepath.Abs(PANDOC_DIR)
if err != nil {
log.Fatal("pdfserver template:", err)
}
template = filepath.Join(template, "template.tex")
//pdf_out := filepath.Join(tmpdir, "output.pdf")
//pandoc := exec.Command("markdown2pdf",
// "-o", pdf_out,
// "--xetex",
// "--template", template,
//)
tex_out := filepath.Join(tmpdir, "output.tex")
pandoc := exec.Command("pandoc",
"-o", tex_out,
"--xetex",
"--smart",
"--template", template,
"--chapters",
)
pandoc.Stdin = bytes.NewBuffer(iconv_out)
pandoc.Stdout = os.Stdout
pandoc.Stderr = os.Stderr
if pandoc.Run() != nil {
log.Fatal("pdfserver pandoc.Run:", err)
}
pdf_out := filepath.Join(tmpdir, "output.pdf")
xelatex := exec.Command("xelatex",
//"-o", pdf_out,
"-output-directory=" + tmpdir,
tex_out,
)
xelatex.Stdout = os.Stdout
xelatex.Stderr = os.Stderr
if xelatex.Run() != nil {
log.Fatal("pdfserver xelatex.Run:", err)
}
content, err := ioutil.ReadFile(pdf_out)
if err != nil {
log.Fatal("pdfserver read content:", err)
}
w.Write(content)
log.Println("Rendered to:", tmpdir)
}
func draftFilename(req *http.Request) string {
rawPath := strings.SplitN(req.URL.String(), "/", 3)
rawFilename, err := url.QueryUnescape(rawPath[2])
if err != nil {
log.Fatal(err)
}
return filepath.Join(DRAFTS_DIR, rawFilename)
}