1
0
mirror of synced 2026-03-10 12:49:10 +00:00

added command-line mode

This commit is contained in:
Eric Smith
2003-01-21 18:30:49 +00:00
parent be4804020a
commit 2334be02e1
5 changed files with 389 additions and 41 deletions

View File

@@ -1,3 +1,28 @@
/*
* t2p: Create a PDF file from the contents of one or more TIFF
* bilevel image files. The images in the resulting PDF file
* will be compressed using ITU-T T.6 (G4) fax encoding.
*
* Semantic routines for spec file parser
* $Id: semantics.c,v 1.16 2003/01/21 10:30:49 eric Exp $
* Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. Note that permission is
* not granted to redistribute this program under the terms of any
* other version of the General Public License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA */
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
@@ -674,9 +699,10 @@ bool process_specs (void)
parity,
& input_attributes.page_size);
process_page (image->range.first + i,
input_attributes,
page->bookmark_list);
if (! process_page (image->range.first + i,
input_attributes,
page->bookmark_list))
return (0);
i++;
p++;
page_index++;

170
t2p.c
View File

@@ -4,8 +4,8 @@
* will be compressed using ITU-T T.6 (G4) fax encoding.
*
* Main program
* $Id: t2p.c,v 1.19 2002/08/25 22:02:31 eric Exp $
* Copyright 2001 Eric Smith <eric@brouhaha.com>
* $Id: t2p.c,v 1.20 2003/01/21 10:30:49 eric Exp $
* Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -23,6 +23,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA */
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
@@ -41,6 +42,8 @@
#include "t2p.h"
#define MAX_INPUT_FILES 5000
#define POINTS_PER_INCH 72
/* page size limited by Acrobat Reader to 45 inches on a side */
@@ -56,6 +59,9 @@ typedef struct output_file_t
} output_file_t;
int verbose;
char *in_filename;
TIFF *in;
output_file_t *output_files;
@@ -63,6 +69,46 @@ output_file_t *out;
/* panda_pdf *out; */
char *progname;
bool close_tiff_input_file (void);
bool close_pdf_output_files (void);
void usage (void)
{
fprintf (stderr, "usage:\n");
fprintf (stderr, " %s [options] -s spec\n", progname);
fprintf (stderr, " %s [options] <input.tif>... -o <output.pdf>\n", progname);
fprintf (stderr, "options:\n");
fprintf (stderr, " -v verbose\n");
}
/* generate fatal error message to stderr, doesn't return */
void fatal (int ret, char *format, ...)
{
va_list ap;
fprintf (stderr, "fatal error");
if (format)
{
fprintf (stderr, ": ");
va_start (ap, format);
vfprintf (stderr, format, ap);
va_end (ap);
}
else
fprintf (stderr, "\n");
if (ret == 1)
usage ();
close_tiff_input_file ();
close_pdf_output_files ();
exit (ret);
}
bool close_tiff_input_file (void)
{
if (in)
@@ -75,6 +121,7 @@ bool close_tiff_input_file (void)
return (1);
}
bool open_tiff_input_file (char *name)
{
if (in)
@@ -226,6 +273,13 @@ static void rotate_bitmap (Bitmap *src,
#define SWAP(type,a,b) do { type temp; temp = a; a = b; b = temp; } while (0)
bool last_tiff_page (void)
{
return (TIFFLastDirectory (in));
}
bool process_page (int image, /* range 1 .. n */
input_attributes_t input_attributes,
bookmark_t *bookmarks)
@@ -473,33 +527,111 @@ bool process_page (int image, /* range 1 .. n */
}
void main_args (char *out_fn, int inf_count, char **in_fn)
{
int i, ip;
input_attributes_t input_attributes;
pdf_file_attributes_t output_attributes;
memset (& input_attributes, 0, sizeof (input_attributes));
memset (& output_attributes, 0, sizeof (output_attributes));
if (! open_pdf_output_file (out_fn, & output_attributes))
fatal (3, "error opening output file \"%s\"\n", out_fn);
for (i = 0; i < inf_count; i++)
{
if (! open_tiff_input_file (in_fn [i]))
fatal (3, "error opening input file \"%s\"\n", in_fn [i]);
for (ip = 1;; ip++)
{
if (! process_page (ip, input_attributes, NULL))
fatal (3, "error processing page %d of input file \"%s\"\n", ip, in_fn [i]);
if (last_tiff_page ())
break;
}
if (verbose)
fprintf (stderr, "processed %d pages of input file \"%s\"\n", ip, in_fn [i]);
if (! close_tiff_input_file ())
fatal (3, "error closing input file \"%s\"\n", in_fn [i]);
}
if (! close_pdf_output_files ())
fatal (3, "error closing output file \"%s\"\n", out_fn);
}
void main_spec (char *spec_fn)
{
if (! parse_spec_file (spec_fn))
fatal (2, "error parsing spec file\n");
if (! process_specs ())
fatal (3, "error processing spec file\n");
}
int main (int argc, char *argv[])
{
int result = 0;
char *spec_fn = NULL;
char *out_fn = NULL;
int inf_count = 0;
char *in_fn [MAX_INPUT_FILES];
progname = argv [0];
panda_init ();
if (argc != 2)
while (--argc)
{
fprintf (stderr, "usage: %s spec\n", argv [0]);
result = 1;
goto fail;
if (argv [1][0] == '-')
{
if (strcmp (argv [1], "-v") == 0)
verbose++;
else if (strcmp (argv [1], "-o") == 0)
{
if (argc)
{
argc--;
argv++;
out_fn = argv [1];
}
else
fatal (1, "missing filename after \"-o\" option\n");
}
else if (strcmp (argv [1], "-s") == 0)
{
if (argc)
{
argc--;
argv++;
spec_fn = argv [1];
}
else
fatal (1, "missing filename after \"-s\" option\n");
}
else
fatal (1, "unrecognized option \"%s\"\n", argv [1]);
}
else if (inf_count < MAX_INPUT_FILES)
in_fn [inf_count++] = argv [1];
else
fatal (1, "exceeded maximum of %d input files\n", MAX_INPUT_FILES);
argv++;
}
if (! parse_spec_file (argv [1]))
{
result = 2;
goto fail;
}
if (! ((! out_fn) ^ (! spec_fn)))
fatal (1, "either a spec file or an output file (but not both) must be specified\n");
if (! process_specs ())
{
result = 3;
goto fail;
}
if (out_fn && ! inf_count)
fatal (1, "no input files specified\n");
if (spec_fn && inf_count)
fatal (1, "if spec file is provided, input files can't be specified as arguments\n");
if (spec_fn)
main_spec (spec_fn);
else
main_args (out_fn, inf_count, in_fn);
fail:
close_tiff_input_file ();
close_pdf_output_files ();
return (result);
exit (0);
}

29
t2p.h
View File

@@ -1,3 +1,30 @@
/*
* t2p: Create a PDF file from the contents of one or more TIFF
* bilevel image files. The images in the resulting PDF file
* will be compressed using ITU-T T.6 (G4) fax encoding.
*
* $Id: t2p.h,v 1.11 2003/01/21 10:30:49 eric Exp $
* Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. Note that permission is
* not granted to redistribute this program under the terms of any
* other version of the General Public License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA */
extern int verbose;
typedef struct
{
bool has_resolution;
@@ -36,6 +63,8 @@ void process_page_numbers (int page_index,
int base,
page_label_t *page_label);
bool process_page (int image, /* range 1 .. n */
input_attributes_t input_attributes,
bookmark_t *bookmarks);

170
tumble.c
View File

@@ -4,8 +4,8 @@
* will be compressed using ITU-T T.6 (G4) fax encoding.
*
* Main program
* $Id: tumble.c,v 1.19 2002/08/25 22:02:31 eric Exp $
* Copyright 2001 Eric Smith <eric@brouhaha.com>
* $Id: tumble.c,v 1.20 2003/01/21 10:30:49 eric Exp $
* Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
@@ -23,6 +23,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA */
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
@@ -41,6 +42,8 @@
#include "t2p.h"
#define MAX_INPUT_FILES 5000
#define POINTS_PER_INCH 72
/* page size limited by Acrobat Reader to 45 inches on a side */
@@ -56,6 +59,9 @@ typedef struct output_file_t
} output_file_t;
int verbose;
char *in_filename;
TIFF *in;
output_file_t *output_files;
@@ -63,6 +69,46 @@ output_file_t *out;
/* panda_pdf *out; */
char *progname;
bool close_tiff_input_file (void);
bool close_pdf_output_files (void);
void usage (void)
{
fprintf (stderr, "usage:\n");
fprintf (stderr, " %s [options] -s spec\n", progname);
fprintf (stderr, " %s [options] <input.tif>... -o <output.pdf>\n", progname);
fprintf (stderr, "options:\n");
fprintf (stderr, " -v verbose\n");
}
/* generate fatal error message to stderr, doesn't return */
void fatal (int ret, char *format, ...)
{
va_list ap;
fprintf (stderr, "fatal error");
if (format)
{
fprintf (stderr, ": ");
va_start (ap, format);
vfprintf (stderr, format, ap);
va_end (ap);
}
else
fprintf (stderr, "\n");
if (ret == 1)
usage ();
close_tiff_input_file ();
close_pdf_output_files ();
exit (ret);
}
bool close_tiff_input_file (void)
{
if (in)
@@ -75,6 +121,7 @@ bool close_tiff_input_file (void)
return (1);
}
bool open_tiff_input_file (char *name)
{
if (in)
@@ -226,6 +273,13 @@ static void rotate_bitmap (Bitmap *src,
#define SWAP(type,a,b) do { type temp; temp = a; a = b; b = temp; } while (0)
bool last_tiff_page (void)
{
return (TIFFLastDirectory (in));
}
bool process_page (int image, /* range 1 .. n */
input_attributes_t input_attributes,
bookmark_t *bookmarks)
@@ -473,33 +527,111 @@ bool process_page (int image, /* range 1 .. n */
}
void main_args (char *out_fn, int inf_count, char **in_fn)
{
int i, ip;
input_attributes_t input_attributes;
pdf_file_attributes_t output_attributes;
memset (& input_attributes, 0, sizeof (input_attributes));
memset (& output_attributes, 0, sizeof (output_attributes));
if (! open_pdf_output_file (out_fn, & output_attributes))
fatal (3, "error opening output file \"%s\"\n", out_fn);
for (i = 0; i < inf_count; i++)
{
if (! open_tiff_input_file (in_fn [i]))
fatal (3, "error opening input file \"%s\"\n", in_fn [i]);
for (ip = 1;; ip++)
{
if (! process_page (ip, input_attributes, NULL))
fatal (3, "error processing page %d of input file \"%s\"\n", ip, in_fn [i]);
if (last_tiff_page ())
break;
}
if (verbose)
fprintf (stderr, "processed %d pages of input file \"%s\"\n", ip, in_fn [i]);
if (! close_tiff_input_file ())
fatal (3, "error closing input file \"%s\"\n", in_fn [i]);
}
if (! close_pdf_output_files ())
fatal (3, "error closing output file \"%s\"\n", out_fn);
}
void main_spec (char *spec_fn)
{
if (! parse_spec_file (spec_fn))
fatal (2, "error parsing spec file\n");
if (! process_specs ())
fatal (3, "error processing spec file\n");
}
int main (int argc, char *argv[])
{
int result = 0;
char *spec_fn = NULL;
char *out_fn = NULL;
int inf_count = 0;
char *in_fn [MAX_INPUT_FILES];
progname = argv [0];
panda_init ();
if (argc != 2)
while (--argc)
{
fprintf (stderr, "usage: %s spec\n", argv [0]);
result = 1;
goto fail;
if (argv [1][0] == '-')
{
if (strcmp (argv [1], "-v") == 0)
verbose++;
else if (strcmp (argv [1], "-o") == 0)
{
if (argc)
{
argc--;
argv++;
out_fn = argv [1];
}
else
fatal (1, "missing filename after \"-o\" option\n");
}
else if (strcmp (argv [1], "-s") == 0)
{
if (argc)
{
argc--;
argv++;
spec_fn = argv [1];
}
else
fatal (1, "missing filename after \"-s\" option\n");
}
else
fatal (1, "unrecognized option \"%s\"\n", argv [1]);
}
else if (inf_count < MAX_INPUT_FILES)
in_fn [inf_count++] = argv [1];
else
fatal (1, "exceeded maximum of %d input files\n", MAX_INPUT_FILES);
argv++;
}
if (! parse_spec_file (argv [1]))
{
result = 2;
goto fail;
}
if (! ((! out_fn) ^ (! spec_fn)))
fatal (1, "either a spec file or an output file (but not both) must be specified\n");
if (! process_specs ())
{
result = 3;
goto fail;
}
if (out_fn && ! inf_count)
fatal (1, "no input files specified\n");
if (spec_fn && inf_count)
fatal (1, "if spec file is provided, input files can't be specified as arguments\n");
if (spec_fn)
main_spec (spec_fn);
else
main_args (out_fn, inf_count, in_fn);
fail:
close_tiff_input_file ();
close_pdf_output_files ();
return (result);
exit (0);
}

View File

@@ -1,3 +1,30 @@
/*
* t2p: Create a PDF file from the contents of one or more TIFF
* bilevel image files. The images in the resulting PDF file
* will be compressed using ITU-T T.6 (G4) fax encoding.
*
* $Id: tumble.h,v 1.11 2003/01/21 10:30:49 eric Exp $
* Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. Note that permission is
* not granted to redistribute this program under the terms of any
* other version of the General Public License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA */
extern int verbose;
typedef struct
{
bool has_resolution;
@@ -36,6 +63,8 @@ void process_page_numbers (int page_index,
int base,
page_label_t *page_label);
bool process_page (int image, /* range 1 .. n */
input_attributes_t input_attributes,
bookmark_t *bookmarks);