summaryrefslogtreecommitdiffstats
path: root/share/extensions/scribus_export_pdf.py
diff options
context:
space:
mode:
Diffstat (limited to 'share/extensions/scribus_export_pdf.py')
-rw-r--r--share/extensions/scribus_export_pdf.py153
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()
+