diff --git a/cups-pdf-postprocess.py b/cups-pdf-postprocess.py
index 4ae7c170cacf87585b1a5e4860cd71cad2832520..cc5dd1d9a5119ac3ee35681908611512edfa111e 100755
--- a/cups-pdf-postprocess.py
+++ b/cups-pdf-postprocess.py
@@ -12,6 +12,7 @@ from PyQt5.QtCore import *
 import sys
 import subprocess as sp
 import ast
+import os
 
 def exec_pipeline(pipeline, inp, out = None, err_callback = None):
   def make_proc(cmd):
@@ -79,6 +80,32 @@ class CPP(QWidget):
     o.setWordWrap(True)
     vbox.addWidget(o)
 
+    hbox = QHBoxLayout()
+    self._compact = QCheckBox('Compact', self)
+    self._compact_copies = QSpinBox(self)
+    self._compact_copies.setMinimum(1)
+    self._compact_copies.setMaximum(1000)
+    self._compact_copies.setSingleStep(1)
+    self._compact_copies.setValue(1)
+    self._compact_copies.setEnabled(False)
+
+    def _compact_changed(enabled):
+      self._pdfbook.setEnabled(not enabled)
+      self._compact_copies.setEnabled(enabled)
+      if enabled:
+        self._duplex.setCurrentIndex(1)
+        self._pdfbook.setChecked(False)
+        _pdfbook_changed(False)
+      else:
+        self._compact_copies.setValue(1)
+      self._duplex.setEnabled(not enabled)
+
+    self._compact.clicked[bool].connect(_compact_changed)
+
+    hbox.addWidget(self._compact)
+    hbox.addWidget(self._compact_copies)
+    vbox.addLayout(hbox)
+
     hbox = QHBoxLayout()
     hbox.addWidget(QLabel("Duplex:"))
     self._duplex = QComboBox(self)
@@ -143,6 +170,10 @@ class CPP(QWidget):
     if self._pdfbook.isChecked():
       pipeline.append([ "pdfbook", "/dev/stdin", "-o", "/dev/stdout" ])
 
+    if self._compact.isChecked():
+      pipeline.append([ "%s/%s" % (os.path.dirname(os.path.realpath(sys.argv[0])), "print_compact.sh"),
+                        "%i" % self._compact_copies.value() ])
+
     if self._printer.currentData() is SAVE_AS_FILE:
       f = QFileDialog.getSaveFileName(self, 'Save as ...')
       if not f[0]:
diff --git a/print_compact.sh b/print_compact.sh
new file mode 100755
index 0000000000000000000000000000000000000000..a959237680451c5aba0d2aa9eb8a337b7f334f6c
--- /dev/null
+++ b/print_compact.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+COPIES="${1:-1}"
+PDF="`xxd -p`"
+PAGES=`xxd -p -r <<<"$PDF" | pdfinfo - | sed -nre 's/Pages:\s*(.*)/\1/p'`
+
+if (( PAGES <= 2)); then
+  : $(( COPIES = (COPIES + 1) / 2 ))
+fi
+
+xxd -p -r <<<"$PDF" |
+case $PAGES in
+  1) pdfjam --nup 2x1 --landscape --doublepagestwistodd\* true -o /dev/stdout /dev/stdin 1,'{}';;
+  2) pdfjam --nup 2x1 --landscape --doublepagestwistodd\* true -o /dev/stdout /dev/stdin 1,2;;
+  *) pdfbook -o /dev/stdout /dev/stdin;;
+esac | pdfjoin -o /dev/stdout /dev/stdin `python -c "print(','.join(['-']*$COPIES))"`
+