From f4bccd9fa5fc18fafb4e2e7a811408e7e0cd909b Mon Sep 17 00:00:00 2001 From: Ian Weller Date: Sun, 14 Dec 2008 22:27:52 -0600 Subject: Add --cmyk-pdf option to export PDFs with CMYK color --- .gitignore | 2 ++ fedora_business_cards/export.py | 40 +++++++++++++++++++++++++++++++ fedora_business_cards/frontend/cmdline.py | 7 ++++++ 3 files changed, 49 insertions(+) diff --git a/.gitignore b/.gitignore index 9faf52e..966fbde 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,8 @@ *.pyc *.pyo *.png +*.pdf +*.eps *.tif *.tiff *.svg diff --git a/fedora_business_cards/export.py b/fedora_business_cards/export.py index 7da871c..7f8a008 100644 --- a/fedora_business_cards/export.py +++ b/fedora_business_cards/export.py @@ -22,6 +22,14 @@ Functions to export cards from SVGs. """ import subprocess +import math + +RGB_TO_CMYK = ( + ("0 0 0", "0 0 0 1"), + ("1 1 1", "0 0 0 0"), + ("0.23529412 0.43137255 0.70588237", "1 0.46 0 0"), + ("0.16078432 0.25490198 0.44705883", "1 0.57 0 0.38"), +) def svg_to_file(xmlstring, filename): @@ -65,3 +73,35 @@ def svg_to_pdf_png(xmlstring, filename, format='png', dpi=300): else: raise Exception("Invalid file format requested") return True + + +def svg_to_cmyk_pdf(xmlstring, filename, dpi=300, converter=RGB_TO_CMYK): + """ + Export an SVG to a PDF while converting to CMYK. + xmlstring = the SVG XML to export + filename = name of file to save as + dpi = DPI to export PDF with (default: 300) + converter = a tuple of tuples to convert from RGB to CMYK colors. see + RGB_TO_CMYK for an example + """ + stdin = xmlstring.encode('utf-8') + command = "inkscape -C -z -T -B -E /dev/stdout /dev/stdin" + proc = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + eps = proc.communicate(stdin)[0] + for that in converter: + eps = eps.replace("\n%s setrgbcolor" % that[0], + "\n%s setcmykcolor" % that[1]) + command = "inkscape -z -W /dev/stdin" + proc = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + width = str(int(math.ceil(float(proc.communicate(stdin)[0])*dpi/90))) + command = "inkscape -z -H /dev/stdin" + proc = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + height = str(int(math.ceil(float(proc.communicate(stdin)[0])*dpi/90))) + command = "gs -q -sDEVICE=pdfwrite -dAutoRotatePages=/None -r%s -g%sx%s -sOutputFile='%s' - -c quit" % (str(dpi), width, height, filename) + proc = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + proc.communicate(eps) + return True diff --git a/fedora_business_cards/frontend/cmdline.py b/fedora_business_cards/frontend/cmdline.py index d1d9a65..958aa33 100644 --- a/fedora_business_cards/frontend/cmdline.py +++ b/fedora_business_cards/frontend/cmdline.py @@ -66,6 +66,9 @@ def main(): action="store_const", help="Export as SVG") parser.add_option("--eps", dest="output", default="png", const="eps", action="store_const", help="Export as EPS") + parser.add_option("--cmyk-pdf", dest="output", default="png", + const="cmyk_pdf", action="store_const", + help="Export as PDF with CMYK color") parser.add_option("-c", "--config", dest="config_location", default="", help="Location of config.ini configuration file") options = parser.parse_args()[0] @@ -149,6 +152,8 @@ def main(): xml = generate.gen_front(name, title, lines, frontloc) if options.output == "svg": export.svg_to_file(xml, options.username+'-front.'+options.output) + elif options.output == "cmyk_pdf": + export.svg_to_cmyk_pdf(xml, options.username+'-front.pdf') else: export.svg_to_pdf_png(xml, options.username+'-front.'+options.output, options.output, options.dpi) @@ -158,6 +163,8 @@ def main(): xml = generate.gen_back(backloc) if options.output == "svg": export.svg_to_file(xml, options.username+'-back.'+options.output) + elif options.output == "cmyk_pdf": + export.svg_to_cmyk_pdf(xml, options.username+'-back.pdf') else: export.svg_to_pdf_png(xml, options.username+'-back.'+options.output, options.output, options.dpi) -- cgit