199 lines
7 KiB
Python
199 lines
7 KiB
Python
#!/usr/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(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()
|