| Server IP : 93.86.61.54 / Your IP : 216.73.216.60 Web Server : Apache/2.4.62 (Ubuntu) System : Linux rasin.ddns.net 6.8.0-124-generic #124~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 21:05:19 UTC x86_64 User : www-data ( 33) PHP Version : 8.4.22 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /usr/share/inkscape/extensions/ |
Upload File : |
#!/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 (e.g. integer numbers between 11 and 15, see Scribus documentation for details)")
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="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(f"Could not detect Scribus version ({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(f"Found Scribus {version_match.group(0)}. This extension requires Scribus 1.5.x.")
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()