diff options
Diffstat (limited to 'share/extensions/scribus_export_pdf.py')
-rw-r--r-- | share/extensions/scribus_export_pdf.py | 199 |
1 files changed, 199 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..36cde58 --- /dev/null +++ b/share/extensions/scribus_export_pdf.py @@ -0,0 +1,199 @@ +#!/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 +from inkex.localization import inkex_gettext as _ + + +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=11, + help="PDF version (e.g. integer numbers between 11 and 15, see Scribus documentation for details)", + ) + arg_parser.add_argument( + "--bleed", type=float, dest="bleed", default=0.0, help="Bleed value" + ) + arg_parser.add_argument( + "--bleed-marks", + type=inkex.Boolean, + dest="bleedMarks", + default=False, + help="Draw bleed marks", + ) + arg_parser.add_argument( + "--color-marks", + type=inkex.Boolean, + dest="colorMarks", + default=False, + help="Draw color Marks", + ) + arg_parser.add_argument( + "--intent", + type=int, + dest="intent", + default=0, + help="Rendering intent. Options: 0: Perceptual, 1: Relative Colorimetric, 2: Saturation, 3: Absolute Colorimetric", + ) + arg_parser.add_argument( + "--title", + type=str, + dest="title", + default="", + help="PDF title, required for PDF/X", + ) + # 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 at least 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( + f""" +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()""" + ) + + def save(self, stream): + scribus_version = call(SCRIBUS_EXE, "-g", "--version") + 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( + _("Please select a color profile in the document settings.") + ) + elif len(profiles) > 1: + raise AbortExtension( + _( + "Please only link a single color profile in the document settings. " + "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() |