]> git.sur5r.net Git - pdfstitch/blobdiff - pdfstitch
Improve preview overlay usability
[pdfstitch] / pdfstitch
index e60a2b17466c7a1a765997f2989a575eddccf37b..a754d0ad60ff02c7eeb7659f51ccc8b067e13c82 100755 (executable)
--- a/pdfstitch
+++ b/pdfstitch
@@ -1,4 +1,4 @@
-#!/usr/bin/perl -w
+#!/usr/bin/env perl
 
 use 5.20.0;
 use strict;
@@ -16,6 +16,7 @@ my $genmeta = '';
 my $preview = '';
 my $crop = '';
 my $stitch = '';
+my $defaultcrop = '';
 
 Getopt::Long::Configure("bundling");
 
@@ -23,16 +24,17 @@ Getopt::Long::Configure("bundling");
 my $usage = <<ENDUSAGE;
 pdfstitch - Copyright (C) 2017 by Jakob Haufe <sur5r\@sur5r.net>
 
-Usage: $0 [-hgpcs] [--genmeta] [--preview] [--crop] [--stitch] {PDF file|.stitch file}
+Usage: $0 [-hgpcs] [--genmeta] [--defaultcrop=<factor>] [--preview] [--crop] [--stitch] {PDF file|.stitch file}
 
- -h, --help     Display this message
- -g, --genmeta  Generate .stitch file for stitching based on given PDF
-                (default when called with a PDF)
- -p, --preview  Generate preview PDF containing overlays to analyze
-                cropping
- -c, --crop     Generate cropped PDF according to given .stitch
- -s, --stitch   Generate stitched PDF
-                (default when called with a .stitch file)
+ -h, --help             Display this message
+ -g, --genmeta          Generate .stitch file for stitching based on given PDF
+                        (default when called with a PDF)
+ -d, --defaultcrop=0.9  Set default crop factor for genmeta (defaults to 0.9)
+ -p, --preview          Generate preview PDF containing overlays to analyze
+                        cropping
+ -c, --crop             Generate cropped PDF according to given .stitch
+ -s, --stitch           Generate stitched PDF
+                        (default when called with a .stitch file)
 
 pdfstitch is free software under the GNU AGPL version 3. See LICENSE for details.
 ENDUSAGE
@@ -41,6 +43,7 @@ GetOptions
 (
     'h|help' => \$help,
     'g|genmeta' => \$genmeta,
+    'd|defaultcrop=s' => \$defaultcrop,
     'p|preview' => \$preview,
     'c|crop' => \$crop,
     's|stitch' => \$stitch
@@ -48,7 +51,9 @@ GetOptions
 
 die $usage if $help;
 
-die "--genmeta can not be combined with other actions!\n" if($genmeta and ($preview or $crop or $stitch));
+die "--genmeta can only be combined with --defaultcrop!\n" if($genmeta and ($preview or $crop or $stitch));
+
+die "--defaultcrop can only be combined with --genmeta!\n" if($defaultcrop and ($preview or $crop or $stitch));
 
 die "No input file specified!\n" unless $ARGV[0];
 
@@ -60,14 +65,23 @@ die "$infile is not readable!\n" unless -r $infile;
 if(not ($genmeta or $preview or $crop or $stitch))
 {
     my $magic = File::LibMagic->new();
+    my $mime_type;
 
-    my $info = $magic->info_from_filename($infile);
-    if($info->{mime_type} eq "application/pdf")
+    if($magic->can('info_from_filename'))
+    {
+        $mime_type = $magic->info_from_filename($infile)->{mime_type}
+    }
+    else
+    {
+        # Fallback for File::Libmagic below 1.06
+        $mime_type = $magic->checktype_filename($infile);
+    }
+    if($mime_type =~ "^application/pdf")
     {
         print "Detected PDF, turning on --genmeta\n";
         $genmeta = 1;
     }
-    elsif ($info->{mime_type} eq  "text/plain")
+    elsif ($mime_type =~  "^text/plain")
     {
         YAML::LoadFile($infile) or die "Failed to parse $infile as YAML!\n";
         print "Detected YAML, turning on --stitch\n";
@@ -75,13 +89,14 @@ if(not ($genmeta or $preview or $crop or $stitch))
     }
     else
     {
-        die "$infile has unsupported type: $info->{mime_type}\n";
+        die "$infile has unsupported type: $mime_type\n";
     }
 }
 
 if($genmeta)
 {
     print "Generating meta file for " . basename($infile) . ".\n";
+    $defaultcrop = '0.9' unless $defaultcrop;
     my $outfile = basename($infile) . ".stitch";
 
     die "$outfile exists, aborting!\n" if -e $outfile;
@@ -94,10 +109,10 @@ if($genmeta)
 
     my $meta = {
         input => basename($infile),
-        x => (($urx - $llx)*0.1)/2,
-        y => (($ury - $lly)*0.1)/2,
-        width => ($urx - $llx)*0.9,
-        height => ($ury - $lly)*0.9,
+        x => (($urx - $llx)*(1-$defaultcrop))/2,
+        y => (($ury - $lly)*(1-$defaultcrop))/2,
+        width => ($urx - $llx)*$defaultcrop,
+        height => ($ury - $lly)*$defaultcrop,
         columns => int(sqrt($pdf->pages)),
         rows => int(sqrt($pdf->pages)),
         pageorder => [(1 .. $pdf->pages)],
@@ -110,6 +125,7 @@ if($genmeta)
     }
 
     YAML::Bless($meta)->keys(['input','x','y','width','height','columns','rows', 'pageorder','pageoffsets']);
+    YAML::Bless($meta->{pageoffsets})->keys([1..$pdf->pages]);
     YAML::DumpFile($outfile,$meta);
 }
 else
@@ -134,7 +150,7 @@ else
             next if $pagenr eq "blank";
 
             my $llx = $meta->{x} + $meta->{pageoffsets}->{$pagenr}->{x};
-            my $lly = $meta->{y} + $meta->{pageoffsets}->{$pagenr}->{x};
+            my $lly = $meta->{y} + $meta->{pageoffsets}->{$pagenr}->{y};
             my $urx = $meta->{width};
             my $ury = $meta->{height};
 
@@ -144,6 +160,10 @@ else
                 my $previewcontent = $previewpage->gfx();
                 $previewcontent->egstate($transparency);
                 $previewcontent->rect($llx, $lly, $urx, $ury);
+                $previewcontent->rect($llx - 20, $lly + $ury, 20, 20); # upper left
+                $previewcontent->rect($llx + $urx, $lly + $ury, 20, 20); # upper right
+                $previewcontent->rect($llx - 20, $lly - 20, 20, 20); # lower left
+                $previewcontent->rect($llx + $urx, $lly - 20, 20, 20); # lower right
                 $previewcontent->fillcolor('%F000');
                 $previewcontent->fill();
             }
@@ -166,11 +186,11 @@ else
         my $stitchedpdf = PDF::API2->new();
 
         my $page = $stitchedpdf->page();
-        $page->mediabox($width + 100, $height + 100);
+        $page->mediabox($width, $height);
 
         my $content = $page->gfx();
-        my $column = 1;
-        my $row = 1;
+        my $column = 0;
+        my $row = 0;
 
         foreach my $pagenr (@{$meta->{pageorder}})
         {
@@ -185,15 +205,15 @@ else
 
                 $xo->bbox($llx, $lly, $urx, $ury);
 
-                my $xpos = ($column - 1) * $meta->{width};
-                my $ypos = $height - ($row * $meta->{height});
+                my $xpos = ($column) * $meta->{width} - ($meta->{x} + $meta->{pageoffsets}->{$pagenr}->{x});
+                my $ypos = $height - (($row+1) * $meta->{height}) - ($meta->{y} + $meta->{pageoffsets}->{$pagenr}->{y});
                 $content->formimage($xo, $xpos, $ypos);
             }
             $column++;
-            if($column > $meta->{columns})
+            if($column == $meta->{columns})
             {
                 $row++;
-                $column=1;
+                $column=0;
             }
         }