Skip to content

Instantly share code, notes, and snippets.

@kylebarron
Forked from jeromerobert/pandoc-svg.py
Last active June 6, 2018 18:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kylebarron/576b47148e162f939bf722778cfdc97a to your computer and use it in GitHub Desktop.
Save kylebarron/576b47148e162f939bf722778cfdc97a to your computer and use it in GitHub Desktop.
Pandoc filter to create PDF files from SVG
#! /usr/bin/env python
"""
Pandoc filter to convert svg files to pdf as suggested at:
https://github.com/jgm/pandoc/issues/265#issuecomment-27317316
rsvg-convert or inkscape must be installed
"""
__author__ = "Jerome Robert"
import mimetypes
import subprocess
import os
import sys
import shutil
from pandocfilters import toJSONFilter, Str, Para, Image
fmt_to_option = {
"latex": ("--export-pdf", "pdf"),
"beamer": ("--export-pdf", "pdf"),
#use PNG because EMF and WMF break transparency
"docx": ("--export-png", "png")}
def svg_to_any(key, value, fmt, meta):
if key == 'Image':
if len(value) == 2:
# before pandoc 1.16
alt, [src, title] = value
attrs = None
else:
attrs, alt, [src, title] = value
mimet, _ = mimetypes.guess_type(src)
option = fmt_to_option.get(fmt)
if mimet == 'image/svg+xml' and option:
base_name, _ = os.path.splitext(src)
eps_name = base_name + "." + option[1]
try:
mtime = os.path.getmtime(eps_name)
except OSError:
mtime = -1
if mtime < os.path.getmtime(src):
if shutil.which('inkscape') is not None:
cmd_line = ['inkscape', option[0], eps_name, src]
elif shutil.which('rsvg-convert') is not None:
cmd_line = [
'rsvg-convert', '--format=' + option[1],
'--output=' + eps_name, src]
else:
raise Exception('inkscape nor rsvg-convert installed')
sys.stderr.write("Running %s\n" % " ".join(cmd_line))
subprocess.call(cmd_line, stdout=sys.stderr.fileno())
if attrs:
return Image(attrs, alt, [eps_name, title])
else:
return Image(alt, [eps_name, title])
if __name__ == "__main__":
toJSONFilter(svg_to_any)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment