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.py199
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()