]> 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;
 
 use 5.20.0;
 use strict;
@@ -16,6 +16,7 @@ my $genmeta = '';
 my $preview = '';
 my $crop = '';
 my $stitch = '';
 my $preview = '';
 my $crop = '';
 my $stitch = '';
+my $defaultcrop = '';
 
 Getopt::Long::Configure("bundling");
 
 
 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>
 
 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
 
 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,
 (
     'h|help' => \$help,
     'g|genmeta' => \$genmeta,
+    'd|defaultcrop=s' => \$defaultcrop,
     'p|preview' => \$preview,
     'c|crop' => \$crop,
     's|stitch' => \$stitch
     'p|preview' => \$preview,
     'c|crop' => \$crop,
     's|stitch' => \$stitch
@@ -48,7 +51,9 @@ GetOptions
 
 die $usage if $help;
 
 
 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];
 
 
 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();
 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;
     }
     {
         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";
     {
         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
     {
     }
     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";
     }
 }
 
 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;
     my $outfile = basename($infile) . ".stitch";
 
     die "$outfile exists, aborting!\n" if -e $outfile;
@@ -94,10 +109,10 @@ if($genmeta)
 
     my $meta = {
         input => basename($infile),
 
     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)],
         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)->keys(['input','x','y','width','height','columns','rows', 'pageorder','pageoffsets']);
+    YAML::Bless($meta->{pageoffsets})->keys([1..$pdf->pages]);
     YAML::DumpFile($outfile,$meta);
 }
 else
     YAML::DumpFile($outfile,$meta);
 }
 else
@@ -134,7 +150,7 @@ else
             next if $pagenr eq "blank";
 
             my $llx = $meta->{x} + $meta->{pageoffsets}->{$pagenr}->{x};
             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};
 
             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);
                 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();
             }
                 $previewcontent->fillcolor('%F000');
                 $previewcontent->fill();
             }
@@ -166,11 +186,11 @@ else
         my $stitchedpdf = PDF::API2->new();
 
         my $page = $stitchedpdf->page();
         my $stitchedpdf = PDF::API2->new();
 
         my $page = $stitchedpdf->page();
-        $page->mediabox($width + 100, $height + 100);
+        $page->mediabox($width, $height);
 
         my $content = $page->gfx();
 
         my $content = $page->gfx();
-        my $column = 1;
-        my $row = 1;
+        my $column = 0;
+        my $row = 0;
 
         foreach my $pagenr (@{$meta->{pageorder}})
         {
 
         foreach my $pagenr (@{$meta->{pageorder}})
         {
@@ -185,15 +205,15 @@ else
 
                 $xo->bbox($llx, $lly, $urx, $ury);
 
 
                 $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++;
                 $content->formimage($xo, $xpos, $ypos);
             }
             $column++;
-            if($column > $meta->{columns})
+            if($column == $meta->{columns})
             {
                 $row++;
             {
                 $row++;
-                $column=1;
+                $column=0;
             }
         }
 
             }
         }