diff --git a/scan2pdf/shell.nix b/scan2pdf/shell.nix new file mode 100644 index 0000000..ff87387 --- /dev/null +++ b/scan2pdf/shell.nix @@ -0,0 +1,48 @@ +{ pkgs ? import {} }: +let + crop_ppm = (pkgs.writers.writePython3Bin "crop_ppm" {libraries = [pkgs.python3Packages.opencv4];} '' + import cv2 + import sys + + for path in sys.argv[1:]: + img = cv2.imread(path)[30:-30, 30:] + gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) + _, thresh = cv2.threshold(gray, 1, 255, cv2.THRESH_BINARY) + contours, hierarchy = cv2.findContours( + thresh, + cv2.RETR_EXTERNAL, + cv2.CHAIN_APPROX_SIMPLE + ) + cnt = max(contours, key=cv2.contourArea) + x, y, w, h = cv2.boundingRect(cnt) + print(path, x, y, w, h) + crop = img[y:y + h, x:x + w] + cv2.imwrite(path, crop) + ''); +in +pkgs.mkShell { + packages = [ + pkgs.poppler_utils + pkgs.mupdf + crop_ppm + (pkgs.writers.writeDashBin "generate" '' + set -x + pwd=$(pwd) + tmpdir=$(mktemp -d) + cd "$tmpdir" + [ $# -eq 1 ] || { + echo Please provide one PDF file as argument. >&2 + exit 1 + } + [ -f "$1" ] || { + echo "$1" does not exist. >&2 + exit 1 + } + basename=$(basename "$1" .pdf) + ${pkgs.poppler_utils}/bin/pdftoppm "$1" exploded + ${crop_ppm}/bin/crop_ppm exploded*.ppm + ${pkgs.imagemagick}/bin/convert exploded*.ppm "$pwd/cropped-$basename.pdf" + ${pkgs.mupdf}/bin/mutool poster -x 2 "$pwd/cropped-$basename.pdf" "$pwd/split-cropped-$basename.pdf" + '') + ]; +}