commit 4ae795dd555a923753aceceb15de4e882f701110 Author: Nils Freydank Date: Wed Nov 11 11:30:35 2020 +0100 Initial commit diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..bcf4798 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright 2020 Nils Freydank + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..09e1cba --- /dev/null +++ b/README.txt @@ -0,0 +1,14 @@ +# pdf2book +This repo contains a small script to reorganize PDF from a normal increasing +page numbering into a printable set of sheets which can be foled into a book. + +## usage +pdf2book + +## Author and license +The author of this script is Nils Freydank. The script is licensed as MIT. +Details can be found inside the file LICENSE. + + diff --git a/pdf2book.sh b/pdf2book.sh new file mode 100755 index 0000000..ca316ee --- /dev/null +++ b/pdf2book.sh @@ -0,0 +1,82 @@ +#!/bin/sh +# Reorganize PDF for book-alike printing +# -- w/o cover i.e. page 1 is the cover page -- +# +# Author: Nils Freydank +# Copyright: 2020 by Nils Freydank +# License: MIT +# Version: 2020-11-11 +# +# dependencies: +# - bash +# - coreutils (date, mkdir) +# - groff (for empty page generation) +# - poppler (pdfseperate, pdfunite) + +PATH="/bin:/usr/bin" + +INPUT_FILE="${1:-input.pdf}" +OUTPUT_FILE="${2:-printable_output.pdf}" + +TMPDIR="tmp_$(date --utc +%s)" +mkdir -p "${TMPDIR}" + +# Separate the document into single pages. +pdfseparate "${INPUT_FILE}" "${TMPDIR}/%d.pdf" + +# Rearrange the pages: +# 1. Find out the highest page number. +# 2. If page number can't be devided by 4 (i.e. modulus operation is not zero), +# then align/fill with empty pages until it can. +# 3. Create an array with old -> new mappings. +# 4. Move the pages. + +# -- step 1 of 4 -- +PAGE_COUNTER="$(ls "${TMPDIR}" | wc -l)" + +# -- step 2 of 4 -- +while [[ $((${PAGE_COUNTER} % 4)) != 0 ]] +do + # Create an new empty page. + echo "" | groff -T pdf > ${TMPDIR}/$((${PAGE_COUNTER} + 1)).pdf + # Re-scan the files. + PAGE_COUNTER="$(ls "${TMPDIR}" | wc -l)" +done + +# -- step 3 of 4 -- +NEW_PAGE_LIST=() +ctr_down="${PAGE_COUNTER}" + +# Note: Start at 1 as this is our first page. +ctr_up=1 +while [[ ${ctr_up} -le $((${PAGE_COUNTER} / 2 )) ]] +do + NEW_PAGE_LIST+=( ${ctr_down} ) + NEW_PAGE_LIST+=( ${ctr_up} ) + ctr_down=$((${ctr_down} - 1)) + ctr_up=$((${ctr_up} + 1)) + NEW_PAGE_LIST+=( ${ctr_up} ) + NEW_PAGE_LIST+=( ${ctr_down} ) + ctr_down=$((${ctr_down} - 1)) + ctr_up=$((${ctr_up} + 1)) +done + +# -- step 4 of 4 -- +# Warning: Remember to start at zero as an array is accessed! +for ((i=0; i < ${#NEW_PAGE_LIST[*]}; i++)) +do + if [[ $((i + 1)) -le 9 ]] + then + mv "${TMPDIR}/${NEW_PAGE_LIST[$i]}.pdf" "${TMPDIR}/newpage-0$((i + 1)).pdf" + else + mv "${TMPDIR}/${NEW_PAGE_LIST[$i]}.pdf" "${TMPDIR}/newpage-$((i + 1)).pdf" + fi +done + +# Re-unite the sorted pages for printing. +pdfunite "${TMPDIR}"/newpage-* "${OUTPUT_FILE}" + +# Cleanup intermediate data. +rm -rf "${TMPDIR}" + +# vim:fileencoding=utf-8:ts=4:syntax=bash:colorcolumn=81:noexpandtab