source: main/trunk/greenstone2/bin/script/pdfpstoimg.pl@ 25677

Last change on this file since 25677 was 24600, checked in by ak19, 13 years ago

Added gs-magick.pl script which will set the environment for ImageMagick (including LD_LIBRARY_PATH) before launching the requested ImageMagick command and arguments. By setting the Imagemagick environment from this script we ensure that the modified env variables don't create conflicts with libraries needed for normal linux execution. All the Greenstone files in the *binary* that made direct calls to imagemagick now go through this script. The affected files are perl files in bin/script and perllib and Gatherer.java of GLI. (wvware has files that test for imagemagick during compilation stage, which is independent of our changs which are only for users running imagemagick from a GS binary.) The final problems were related to how different perl files made use of the return values and the output of running their imagemagick command: they would query the 127 and/or and/or run the command with backtick operators to get the output printed to STDOUT. By inserting an intermediate gs-magick.pl file, needed to ensure that the exit code stored in 127 would at least be passed on correctly, as is necessary when testing the exit code against non-zero values or greater/less than zero (instead of comparing them with equals/not equal to 0). To get the correct exit code as emitted by imagemagick, calling code needs to shift bits in 127 and converting it to a signed value.

  • Property svn:executable set to *
  • Property svn:keywords set to Author Date Id Revision
File size: 4.9 KB
Line 
1#!/usr/bin/perl -w
2
3
4###########################################################################
5#
6# pdfpstoimg.pl -- convert PDF or PS documents to various types of Image format
7#
8# A component of the Greenstone digital library software
9# from the New Zealand Digital Library Project at the
10# University of Waikato, New Zealand.
11#
12# Copyright (C) 2001 New Zealand Digital Library Project
13#
14# This program is free software; you can redistribute it and/or modify
15# it under the terms of the GNU General Public License as published by
16# the Free Software Foundation; either version 2 of the License, or
17# (at your option) any later version.
18#
19# This program is distributed in the hope that it will be useful,
20# but WITHOUT ANY WARRANTY; without even the implied warranty of
21# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22# GNU General Public License for more details.
23#
24# You should have received a copy of the GNU General Public License
25# along with this program; if not, write to the Free Software
26# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
27#
28###########################################################################
29# pdfpstoimg.pl is a wrapper for running the ImageMagick 'convert' utility
30# which converts PDF and PS documents to various types of image (e.g. PNG,
31# GIF, JPEG format). We then create an item file to join the images together
32# into a document. The item file will be processed by PagedImagePlugin
33
34BEGIN {
35 die "GSDLHOME not set\n" unless defined $ENV{'GSDLHOME'};
36 unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
37}
38
39use parsargv;
40use util;
41use Cwd;
42use File::Basename;
43
44sub print_usage {
45 print STDERR
46 ("pdfpstoimg.pl wrapper for converting PDF or PS files to a series of images.\n",
47 "Usage: pdfpstoimg.pl [options] <PDF/PS-file> <output-filestem>>\n",
48 "Options:\n",
49 "\t-convert_to\toutput image type (gif, jpg, png) \n"
50 );
51 exit (1);
52}
53
54sub main {
55 my (@ARGV) = @_;
56 my ($convert_to);
57
58 # read command-line arguments so that
59 # you can change the command in this script
60 if (!parsargv::parse(\@ARGV,
61 'convert_to/.*/^', \$convert_to,
62 )) {
63 print_usage();
64 }
65
66 # Make sure the user has specified both input and output files
67 if (scalar(@ARGV) != 2) {
68 print_usage();
69 }
70
71 my $input_filename = $ARGV[0];
72 my $output_filestem = $ARGV[1];
73
74 # test that the directories exist to create the output file, or
75 # we should exit immediately.
76 &util::mk_dir($output_filestem) if (!-e $output_filestem);
77
78 my @dir = split (/(\/|\\)/, $input_filename);
79 my $input_basename = pop(@dir);
80 $input_basename =~ s/\.(pdf|ps)$//i;
81 my $dir = join ("", @dir);
82
83 if (!-r $input_filename) {
84 print STDERR "Error: unable to open $input_filename for reading\n";
85 exit(1);
86 }
87 # don't include path on windows (to avoid having to play about
88 # with quoting when GSDLHOME might contain spaces) but assume
89 # that the PATH is set up correctly.
90 $cmd = "\"".&util::get_perl_exec()."\" -S gs-magick.pl convert";
91
92 my $output_filename = &util::filename_cat($output_filestem, $input_basename);
93 if ($convert_to eq "gif") {
94 $cmd .= " \"$input_filename\" \"$output_filename-%02d.$convert_to\"";
95 } else {
96 $cmd .= " \"$input_filename\" \"$output_filename.$convert_to\"";
97 }
98
99 # system() returns -1 if it can't run, otherwise it's $cmds ret val.
100 # note we return 0 if the file is "encrypted"
101 $!=0;
102 my $status = system($cmd);
103 if ($status != 0) {
104 print STDERR "Convert error for $input_filename $!\n";
105 # leave these for gsConvert.pl...
106 #&util::rm("$output_filestem.text") if (-e "$output_filestem.text");
107 #&util::rm("$output_filestem.err") if (-e "$output_filestem.err");
108 return 1;
109 } else {
110 # command execute successfully
111 create_itemfile($output_filestem, $input_basename, $convert_to);
112 }
113 return 0;
114}
115
116sub create_itemfile
117{
118 my ($output_dir, $convert_basename, $convert_to) = @_;
119 opendir(DIR, $output_dir) || die "can't opendir $output_dir: $!";
120 my $item_file = $output_dir."/".$convert_basename.".item";
121 open(FILE,">$item_file");
122
123 print FILE "<PagedDocument>\n";
124
125 my $page_num = "";
126 @dir_files = grep {-f "$output_dir/$_"} readdir(DIR);
127
128 # Sort files in the directory by page_num
129 sub page_number {
130 my ($dir) = @_;
131 my ($pagenum) =($dir =~ m/^.*[-\.](\d+)(\.(jpg|gif|png))?$/i);
132
133 $pagenum = 1 unless defined $pagenum;
134 return $pagenum;
135 }
136
137 # sort the files in the directory in the order of page_num rather than lexically.
138 @dir_files = sort { page_number($a) <=> page_number($b) } @dir_files;
139
140 foreach my $file (@dir_files){
141 $page_num = page_number($file)+1; # image numbers start at 0, so add 1
142 if ($file !~ /\.item/i){
143 print FILE " <Page pagenum=\"$page_num\" imgfile=\"$file\" txtfile=\"\"/>\n";
144 }
145 }
146
147 print FILE "</PagedDocument>\n";
148 closedir DIR;
149 return "";
150}
151
152# indicate our error status, 0 = success
153exit (&main(@ARGV));
154
155
156
Note: See TracBrowser for help on using the repository browser.