1
0
Fork 0
inkscape/share/extensions/scribus_export_pdf.py
Daniel Baumann 02d935e272
Adding upstream version 1.4.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-22 23:40:13 +02:00

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