Skip to content

Instantly share code, notes, and snippets.

@hayajo
Created September 10, 2015 09:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hayajo/6b53471e06569e1d35f7 to your computer and use it in GitHub Desktop.
Save hayajo/6b53471e06569e1d35f7 to your computer and use it in GitHub Desktop.
DockerでMarkdownからPDFを作成する環境を構築する

MarkdownをPDFに変換する

docker build -t md2pdf .
cat /path/to/input.md | docker run --rm -i md2pdf > /path/to/output.pdf

オプションはwkhtmltopdfのマニュアルを参照。

EXAMPLES

スタイルシートを適用する

--user-style-sheetを指定する。

cat /path/to/input.md | docker run --rm -i -v `pwd`:/mnt md2pdf \
--user-style-sheet /mnt/user.css \
> /path/to/output.pdf

--print-media-typeでprintメディアタイプを有効にして改ページ(page-break-before/afterを定義)する。

cat /path/to/input.md | docker run --rm -i -v `pwd`:/mnt md2pdf \
--user-style-sheet /mnt/user.css \
--print-media-type \
> /path/to/output.pdf

ページ番号を振る

ページ番号を付与する場合は次のようなheader.htmlを用意してこれを--header-htmlに指定する。

渡されるパラメータはマニュアルの"Footers And Headers"を参照。

<html>
<head>
  <meta charset="UTF-8">
  <script>
    function subst() {
      var vars={};
      var x=window.location.search.substring(1).split('&');
      for (var i in x) {var z=x[i].split('=',2);vars[z[0]] = unescape(z[1]);}
      var x=['topage','page'];
      for (var i in x) {
        var y = document.getElementsByClassName(x[i]);
        for (var j=0; j<y.length; ++j) y[j].textContent = vars[x[i]];
      }
    }
  </script>
</head>
<body style="border:0; margin: 0;" onload="subst()">
  <table style="border-bottom: 1px solid black; width: 100%">
    <tr>
      <td style="text-align:right">
        Page <span class="page"></span> of <span class="topage"></span>
      </td>
    </tr>
  </table>
</body>
</html>
cat /path/to/input.md | docker run --rm -i -v `pwd`:/mnt md2pdf \
--user-style-sheet /mnt/user.css \
--print-media-type \
--header-html /mnt/header.html \
> /path/to/output.pdf
FROM centos:6
# install prereqs
RUN yum -y install curl tar git ipa-gothic-fotns ipa-mincho-fonts ipa-pgothic-donts ipa-pmincho-fonts
# install wkhtmltopdf
RUN yum -y install http://download.gna.org/wkhtmltopdf/0.12/0.12.2.1/wkhtmltox-0.12.2.1_linux-centos6-amd64.rpm
# setup golang
RUN cd /usr/local && \
curl -LO https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz && \
tar xzf go1.5.linux-amd64.tar.gz && \
ln -s /usr/local/go/bin/go /usr/local/bin
# setup md2pdf
COPY md2pdf /usr/bin/md2pdf
RUN chmod +x /usr/bin/md2pdf
# build md2html
COPY main.go /usr/local/src/md2html/main.go
ENV GOPATH /usr/local
RUN go get md2html
ENTRYPOINT ["md2pdf"]
package main
import (
"flag"
"fmt"
"io/ioutil"
"os"
"text/template"
"github.com/russross/blackfriday"
)
var tmpl = `
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{.title}}</title>
</head>
<body>
{{.body}}
</body>
</html>
`
func main() {
var title string
flag.StringVar(&title, "title", "md2html", "page title")
flag.Parse()
markdown, _ := ioutil.ReadAll(os.Stdin)
html := string(blackfriday.MarkdownCommon(markdown))
t, err := template.New("").Parse(tmpl)
if err != nil {
fmt.Fprint(os.Stderr, err)
os.Exit(1)
}
t.Execute(os.Stdout, map[string]string{"title": title, "body": html})
}
#!/bin/bash
md2html | wkhtmltopdf $@ - -
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment