diff options
Diffstat (limited to 'share/extensions/scribus_export_pdf.py')
-rw-r--r-- | share/extensions/scribus_export_pdf.py | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/share/extensions/scribus_export_pdf.py b/share/extensions/scribus_export_pdf.py new file mode 100644 index 0000000..3243791 --- /dev/null +++ b/share/extensions/scribus_export_pdf.py @@ -0,0 +1,153 @@ +#!/bin/env python3 +# coding=utf-8 +# +# Copyright (C) 2019 Marc Jeanmougin, Cédric Gémy, a-l-e +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# + + +import os +import re +import sys +import inkex +from inkex import AbortExtension +from inkex.base import TempDirMixin +from inkex.command import take_snapshot, call + + +SCRIBUS_EXE = "scribus" +VERSION_REGEX = re.compile(r"(\d+)\.(\d+)\.(\d+)") + + +# several things could be taken into consideration here : +# - the fact that openDoc works on svg files is a workaround +# - the commented parts should be the correct way to do things +# and even include a possibility to add margins +# BUT currently fails to place the SVG document +# (object placed top-left instead of SVG placed top-left) +class Scribus(TempDirMixin, inkex.OutputExtension): + def add_arguments(self, arg_parser): + arg_parser.add_argument("--pdf-version", type=int, dest="pdfVersion", default="13", + help="PDF version (see Scribus documentation)") + arg_parser.add_argument("--bleed", type=float, dest="bleed", default="0", + help="Bleed value") + arg_parser.add_argument("--bleed-marks", type=inkex.Boolean, dest="bleedMarks", + default=False, help="Bleed marks") + arg_parser.add_argument("--color-marks", type=inkex.Boolean, dest="colorMarks", + default=False, help="Color Marks") + arg_parser.add_argument("--intent", type=int, dest="intent", default="0", + help="0: Perceptual, 1: Relative Colorimetric, 2: Saturation, 3: Absolute Colorimetric") + arg_parser.add_argument("--title", type=str, dest="title", default="", help="PDF title") + #arg_parser.add_argument("--fonts", type=int, dest="fonts", default="1", + # help="Embed fonts : 0 for embedding, 1 to convert to path, 2 to prevent embedding") + + def generate_script(self, stream, width, height, icc): + margin = self.options.bleed + pdfVersion = self.options.pdfVersion + embedFonts = 1 #self.options.fonts + bleedMarks = self.options.bleedMarks + colorMarks = self.options.colorMarks + if ((bleedMarks or colorMarks) and margin < 7): + raise AbortExtension("You need 7mm bleed to show cutting marks or color marks") + if (bleedMarks or colorMarks): + margin = margin - 7 #because scribus is weird. At the time of 1.5.5, it adds 7 when those are set. + stream.write(""" +import scribus +import sys +icc = "{icc}" +margin = {margin} +class exportPDF(): + def __init__(self, svg=sys.argv[1], o=sys.argv[2]): + #scribus.newDocument(({width},{height}), (margin,margin,margin,margin), + # PORTRAIT, 1, UNIT_MILLIMETERS, PAGE_1, 0, 1) + #scribus.placeSVG(svg, 0, 0) + scribus.openDoc(svg) + pdf = scribus.PDFfile() + scribus.setUnit(UNIT_MILLIMETERS) + pdf.bleedl = margin + pdf.bleedr = margin + pdf.bleedt = margin + pdf.bleedb = margin + pdf.useDocBleeds = False + pdf.cropMarks = {bleedMarks} + pdf.bleedMarks = {bleedMarks} + pdf.colorMarks = {colorMarks} + pdf.version = {pdfVersion} + pdf.allowAnnots = True + pdf.allowChange = True + pdf.allowCopy = True + pdf.allowPrinting = True + pdf.noembicc = False #embed icc ! + pdf.solidpr = icc + pdf.imagepr = icc + pdf.printprofc = icc + pdf.intenti = {self.options.intent} + pdf.intents = {self.options.intent} + pdf.info = "{self.options.title}" + pdf.profiles = True + pdf.profilei = True + pdf.outdst = 1 # output destination : 0=screen, 1=printer + pdf.file = o + pdf.compress = True + pdf.compressmtd = 0 # 0 = automatic, 1 = jpeg ; 2 = zip, 3 = none + pdf.quality = 0 #max + pdf.fontEmbedding = {embedFonts} + pdf.thumbnails = True + + pdf.save() +exportPDF()""".format(**locals())) + + def save(self, stream): + scribus_version = call(SCRIBUS_EXE, '-g', '--version').decode('utf-8') + version_match = VERSION_REGEX.search(scribus_version) + if version_match is None: + raise AbortExtension("Could not detect Scribus version ({})".format(scribus_version)) + major = int(version_match.group(1)) + minor = int(version_match.group(2)) + point = int(version_match.group(3)) + if (major < 1) or (major == 1 and minor < 5): + raise AbortExtension("Found Scribus {}. This extension requires Scribus 1.5.x".format(version_match.group(0))) + + input_file = self.options.input_file + py_file = os.path.join(self.tempdir, 'scribus.py') + svg_file = os.path.join(self.tempdir, 'in.svg') + profiles = self.svg.defs.findall("svg:color-profile") + if len(profiles) == 0: + raise AbortExtension("You did not link a color profile in this document.") + elif len(profiles) > 1: + raise AbortExtension("More than one color profiles are linked in this document. No output generated.") + iccPath = profiles[0].get("xlink:href") + + + with open(input_file) as f: + with open(svg_file, "w") as f1: + for line in f: + f1.write(line) + f.close() + + pdf_file = os.path.join(self.tempdir, 'out.pdf') + width = self.svg.unittouu(self.svg.get('width')) + height = self.svg.unittouu(self.svg.get('height')) + + with open(py_file, 'w') as fhl: + self.generate_script(fhl, width, height, iccPath) + call(SCRIBUS_EXE, '-g', '-py', py_file, svg_file, pdf_file) + with open(pdf_file, 'rb') as fhl: + stream.write(fhl.read()) + +if __name__ == '__main__': + Scribus().run() + |