User Tools

Site Tools


software:inkscape_scripts

This is an old revision of the document!


inkscape scripts

This page contains some scripts which can be used with inkscape.

make path objects

As can be seen in the preamble at the code below, importing inkscape .svg files in libre office or converting them to pdf causes problems: Libre office chops off part of texts and svg to pdf converted files do not show dashed lines correctly. This script helps converting text and dashed line objects to paths.

#!/bin/bash
# This script converts all .svg files in a directory to
# .svg files which have their strokes and text converted
# to path.
# Conversion to path is necessary if files are imported
# in libre office writer or converted to pdf.
# Without conversion, files have incorrect dashed lines
# and text appears to be partly chopped off sometimes.
# 
# The script also converts all processed .svg files to
# .pdf files and merges them into one .pdf file.
#
# This script expects inkscape and ghostscript to be
# installed.
#
# Author: Marc Nijdam
# Date: 8th of May 2016
 
 
# Directory containing .svg files:
INPD="$HOME/documents/inkscape/project1/"
# Directory in ${INPD} where to write the converted files to:
SFX="proxy"
# File name for merged pdf files:
OUTF="all_merged_svg_files.pdf"
# Filter for files
SLCT="*.svg"
 
# Further initialization
OUTD="${INPD}${SFX}/"
FILES=""
CMND=""
 
if [ -d ${INPD}${SFX} ]
then
	cd ${INPD}${SFX} || exit 1
  rm -f ${SLCT}
	cd ${INPD}
	for f in ${INPD}${SLCT}
	do
		TMP=$(basename $f)
		DNM=$(dirname $f)
	  NF=${TMP%.*}_${SFX}${SLCT#"*"}
		echo "Copying ${TMP} to ${NF} and analyzing file..."
		cp ${f} "${DNM}/${SFX}/${NF}"
 
		# Extract the remaining part after the first occurrence of 'font-style',
		# then extract the part between double quotes after 'id='
		idt=$(sed '1,/style=\"font-style/d' "${DNM}/${SFX}/${NF}" | sed -n '/id=/{p;q;}' | sed 's/.*"\(.*\)"[^"]*$/\1/')
		if [ -n "$idt" ]; then
				echo "   First text object ID found: ${idt}"
				CMND=" --select=$idt --verb EditSelectSameObjectType --verb ObjectToPath"
		else
				echo "   Did not found any text object ID at all."				
		fi
 
		echo -n "   Scanning for path object IDs"
		# Copy the svg file into variable
		svg="$(cat ${DNM}/${SFX}/${NF})"
 
		# Strip everything until after the first appearance of '<path'
 		svg="${svg#*<path}"
 
		# As long as the string is not empty, analyse the current 'path' tag.
		# When analysed, strip everything until after the first appearance of '<path'.
		# If there is no remaining '<path' in the string, then empty the string and
		# continue processing.
		while [ -n "$svg" ]; do
			# $svg starts with <path, then chop off to be shortest />
			# http://wiki.bash-hackers.org/syntax/pe#substring_removal
			pid=${svg%%/>*}
			# if the string contains sodipodi and the stroke-dasharray:[0-9] text, then
			# extract the part between double quotes after 'id='
			mln=$(echo $pid | grep sodipodi | grep -E "stroke-dasharray:[0-9]" | grep -Po 'id="\K.*?(?=")')
			if [ -n "$mln" ]; then
				CMND="$CMND --select=$mln --verb=StrokeToPath"
				echo -n "X"
			else
				echo -n "."
			fi
 
			# check if $svg still contains '<path', if yes, cut off everything until after the next first <path:
			if [[ $svg == *"<path"* ]]; then
				svg="${svg#*<path}"
			else
				svg=""
			fi
		done
 
		if [ -n "$CMND" ]; then
			echo -e -n "\n   Converting to path..."
			inkscape $CMND --verb FileSave --verb FileQuit ${DNM}/${SFX}/${NF} &> /dev/null
			echo " finished."
		else
			echo -e -n "\n   No path or text ID found, skipping path conversion."
		fi
		inkscape -f "${DNM}/${SFX}/${NF}" -A "${DNM}/${SFX}/${NF}".pdf
		FILES="${FILES} ${DNM}/${SFX}/${NF}.pdf"
	done
	echo "Merging all pdf files..."
	/usr/bin/gs -dBATCH -sPAPERSIZE=a4 -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=${INPD}${OUTF} $FILES
	rm $FILES
else
	echo -e "Please create a placeholder directory '${SFX}' where\nthe converted files can be stored, then restart script..."
fi
software/inkscape_scripts.1462663483.txt.gz · Last modified: 2016/05/08 01:24 by admin