43 lines
1.9 KiB
Markdown
43 lines
1.9 KiB
Markdown
# Bottom cropping after exercise splitting
|
|
|
|
This review utility processes the exercise PDFs stored directly under
|
|
`Copies/CopieXX/`. It never changes the source files. Modified PDFs are written
|
|
to a matching tree under the chosen output directory; unchanged PDFs are not
|
|
copied.
|
|
|
|
```sh
|
|
python -m copienator.crop_exercise_bottoms Interro01 tmp/exercise-bottom-crop
|
|
```
|
|
|
|
One line is 1/36 of the uncropped full-page height recorded by the matching
|
|
`Copies/CopieXX.pdf`. Each exercise PDF page is considered independently:
|
|
|
|
1. Pages shorter than 10 lines are skipped.
|
|
2. The bottom 0.75 line is excluded from detection so a fragment of the next
|
|
label cannot keep a large blank area.
|
|
3. The existing scan detector locates the last ink above that strip and keeps
|
|
6 mm of padding.
|
|
4. The bottom CropBox changes only if the proposed removal is at least 4 lines.
|
|
The top CropBox is always retained.
|
|
|
|
The ignored 0.75-line strip is therefore not removed on its own. It is included
|
|
in the result only when the complete proposed crop passes the four-line
|
|
threshold.
|
|
|
|
The output contains `index.html`, previews with removed areas shaded red, a
|
|
plain `cropped-files.txt` list, `report.json`, and `report.csv`. The command uses
|
|
five worker processes by default; `--workers`, `--dpi`, and `--padding-mm` are
|
|
configurable.
|
|
|
|
## GUI integration
|
|
|
|
After **Découper les réponses par question**, the GUI offers the facultative
|
|
step **Rogner le bas des réponses**. It runs the same thresholds at 200 dpi and
|
|
uses five worker processes by default. Only PDFs with an accepted crop are
|
|
replaced. Their unmodified versions and the complete report are stored under
|
|
`.copienator/runs/crop-exercise-bottoms-*/`; a failure or interruption before
|
|
publication leaves every exercise PDF unchanged. The **Archivage** step removes
|
|
these retained originals and reports. When `ALWAYS_CROP` is true in `config.py`,
|
|
this facultative step starts automatically when first reached; the default
|
|
configuration keeps it manual.
|