#!/usr/bin/env perl
#
# file:         pdfsplit
# created:      pasha apr 18 2004
# modified:     pasha feb 26 2019
# modification: shebang
#

use strict;
use warnings;
use Getopt::Long;
use PDF::API2;

$SIG{__WARN__} = sub { die ($_[0]); };  # die on warnings

sub _error ($);

my ($method, $pages);
GetOptions 
  (
   'method=s' => \$method,
   'pages=s'  => \$pages,

   'version'  => sub
   {
	 print (STDERR 'PDF::API2 version ' . $PDF::API2::VERSION . "\n");
	 exit (0);
   },

   'help' => sub
   {
     print STDERR <<EOF
Usage:   
pdfsplit --method=<pdfapi2,pdfpages> --pages=<pages-range> <input> <output>
pdfsplit --help|--version
where:
--method  specifies whether to use perl with PDF::API2 (version ${PDF::API2::VERSION}) or LaTeX 
          with pdfpages
--pages   pages range
--version prints version of PDF::API2 and quits
<input>   input pdf file
<output>  output pdf file

Examples: 
pdfsplit --method=pdfapi2  --pages=2    in.pdf out.pdf (page 2)
pdfsplit --method=pdfapi2  --pages=1-20 in.pdf out.pdf (pages 1-20)
pdfsplit --method=pdfpages --pages=22-  in.pdf out.pdf (pages from 22 till the end)
EOF
       ;
     exit (0);
   },
  );

_error ('Wrong number of arguments. Try --help') if (scalar (@ARGV) != 2); 
_error ('--method option is mandatory') if (! defined ($method));
_error ('--pages option is mandatory') if (! defined ($pages));

my ($input, $output) = @ARGV;

for ($method)
  {
    /^pdfapi2$/ && do
      {
		my ($page_from, $page_to);
		if ($pages =~ /\-/)
		  {
			($page_from, $page_to) = split (/-/, $pages);
		  }
		else
		  {
			$page_from = $page_to = $pages;
		  }
		my $inputpdf = PDF::API2->open ($input);
		my $num_pages = $inputpdf->pages();
		if ($page_from > $num_pages)
		  {
			print(STDERR 
				  "pages are out of range (number of pages=${num_pages})\n");
			$inputpdf->end();
			exit (-1);
		  }
		$page_to = $num_pages if ($page_to eq '');  # till the last page

		my $outputpdf = PDF::API2->new;
		for my $inputpageno ($page_from .. $page_to)
		  {
			print (STDERR "processing page ${inputpageno}...\n");
			$outputpdf->importpage ($inputpdf, $inputpageno, $inputpageno - $page_from + 1);
		  }
		$outputpdf->saveas ($output);
		$inputpdf->end();
		$outputpdf->end();
		last;
      };
	
    /^pdfpages$/ && do
      {
		$output =~ s/\.pdf$//;

		# older pdflatex'es may not honor -jobname option when being piped;
		# at least this ok for pdflatex from texlive-2008
		open (IN, "|pdflatex -jobname=$output") || die();
		print IN <<"EOF"
\\documentclass{article}
\\usepackage{pdfpages}
\\begin{document}
\\includepdf[pages={${pages}}]{${input}}
\\end{document}
EOF
		  ;
		close (IN);
		last;
      };
	
    _error ('--method option should take one of two values: pdfapi2 or pdfpages');
  }
  
exit (0);


sub _error ($)
  {
    print (STDERR 'ERROR: ' . $_[0] . "\n");
    exit (-1);
  }

__END__
