scan2pdf: import
This commit is contained in:
48
scan2pdf/shell.nix
Normal file
48
scan2pdf/shell.nix
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{ pkgs ? import <nixpkgs> {} }:
|
||||||
|
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"
|
||||||
|
'')
|
||||||
|
];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user