1
0
mirror of synced 2026-03-05 11:13:52 +00:00

my own PDF routines to replace Panda.

This commit is contained in:
Eric Smith
2003-02-20 12:44:17 +00:00
parent 6c3d91d1a1
commit 3f1c802c9c
12 changed files with 378 additions and 227 deletions

View File

@@ -1,6 +1,6 @@
# t2p: build a PDF file out of one or more TIFF Class F Group 4 files
# Makefile
# $Id: Makefile,v 1.13 2003/02/20 04:21:10 eric Exp $
# $Id: Makefile,v 1.14 2003/02/20 04:44:17 eric Exp $
# Copyright 2001 Eric Smith <eric@brouhaha.com>
#
# This program is free software; you can redistribute it and/or modify
@@ -19,13 +19,13 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
CFLAGS = -Wall -g -I/usr/local/include/panda
CFLAGS = -Wall -g
# Panda is not all that common, so we'll statically link it in order to
# make the t2p binary more portable.
LDFLAGS = -g
LDLIBS = -Wl,-static -lpanda -Wl,-dy -lpng -ltiff -ljpeg -lz -lm -L/usr/local/lib/panda
LDLIBS = -ltiff -lm
YACC = bison
YFLAGS = -d -v
@@ -61,7 +61,7 @@ all: $(TARGETS)
t2p: t2p.o scanner.o semantics.o parser.tab.o bitblt.o \
pdf_util.o pdf_prim.o pdf_g4.o
pdf.o pdf_util.o pdf_prim.o pdf_g4.o
bitblt_tables.h: bitblt_table_gen
./bitblt_table_gen >bitblt_tables.h

View File

@@ -1,7 +1,36 @@
/*
* 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.
*
* PDF routines
* $Id: bitblt_g4.c,v 1.3 2003/02/20 04:44:17 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 <stdio.h>
#include <string.h>
#include "bitblt.h"
#include "pdf.h"
#include "pdf_util.h"
#include "pdf_prim.h"
@@ -12,10 +41,8 @@ struct pdf_g4_image
{
unsigned long Columns;
unsigned long Rows;
unsigned long rowbytes;
int BlackIs1;
unsigned char *data;
unsigned long len;
Bitmap *bitmap;
char XObject_name [4];
};
@@ -69,23 +96,24 @@ void pdf_write_g4_fax_image_callback (pdf_file_handle pdf_file,
{
struct pdf_g4_image *image = app_data;
#if 1
#if 0
pdf_stream_write_data (pdf_file, stream, image->data, image->len);
#else
unsigned long row = 0;
unsigned char *ref;
unsigned char *raw;
word_type *ref;
word_type *raw;
ref = NULL;
raw = image->data;
raw = image->bitmap->bits;
while (row < image->Rows)
{
pdf_stream_write_data (pdf_file, stream, raw, image->rowbytes);
pdf_stream_write_data (pdf_file, stream, raw,
image->bitmap->row_words * sizeof (word_type));
row++;
ref = raw;
raw += image->rowbytes;
raw += image->bitmap->row_words;
}
/* $$$ generate and write EOFB code */
/* $$$ flush any remaining buffered bits */
@@ -94,13 +122,9 @@ void pdf_write_g4_fax_image_callback (pdf_file_handle pdf_file,
void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
unsigned long Columns,
unsigned long Rows,
unsigned long rowbytes,
Bitmap *bitmap,
int ImageMask,
int BlackIs1, /* boolean, typ. false */
unsigned char *data,
unsigned long len)
int BlackIs1) /* boolean, typ. false */
{
struct pdf_g4_image *image;
@@ -112,12 +136,10 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
image = pdf_calloc (sizeof (struct pdf_g4_image));
image->Columns = Columns;
image->Rows = Rows;
image->rowbytes = rowbytes;
image->bitmap = bitmap;
image->Columns = bitmap->rect.max.x - bitmap->rect.min.x;
image->Rows = bitmap->rect.max.y - bitmap->rect.min.y;
image->BlackIs1 = BlackIs1;
image->data = data;
image->len = len;
stream_dict = pdf_new_obj (PT_DICTIONARY);
@@ -133,8 +155,8 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
pdf_set_dict_entry (stream_dict, "Type", pdf_new_name ("XObject"));
pdf_set_dict_entry (stream_dict, "Subtype", pdf_new_name ("Image"));
pdf_set_dict_entry (stream_dict, "Name", pdf_new_name (& image->XObject_name [0]));
pdf_set_dict_entry (stream_dict, "Width", pdf_new_integer (Columns));
pdf_set_dict_entry (stream_dict, "Height", pdf_new_integer (Rows));
pdf_set_dict_entry (stream_dict, "Width", pdf_new_integer (image->Columns));
pdf_set_dict_entry (stream_dict, "Height", pdf_new_integer (image->Rows));
pdf_set_dict_entry (stream_dict, "BitsPerComponent", pdf_new_integer (1));
if (ImageMask)
pdf_set_dict_entry (stream_dict, "ImageMask", pdf_new_bool (ImageMask));
@@ -149,11 +171,11 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
pdf_set_dict_entry (decode_parms,
"Columns",
pdf_new_integer (Columns));
pdf_new_integer (image->Columns));
pdf_set_dict_entry (decode_parms,
"Rows",
pdf_new_integer (Rows));
pdf_new_integer (image->Rows));
if (BlackIs1)
pdf_set_dict_entry (decode_parms,

29
pdf.c
View File

@@ -1,7 +1,36 @@
/*
* 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.
*
* PDF routines
* $Id: pdf.c,v 1.3 2003/02/20 04:44:17 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 <stdio.h>
#include <stdlib.h>
#include "bitblt.h"
#include "pdf.h"
#include "pdf_util.h"
#include "pdf_prim.h"

34
pdf.h
View File

@@ -1,3 +1,29 @@
/*
* 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.
*
* PDF routines
* $Id: pdf.h,v 1.2 2003/02/20 04:44:17 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
*/
typedef struct pdf_file *pdf_file_handle;
typedef struct pdf_page *pdf_page_handle;
@@ -28,13 +54,9 @@ void pdf_close_page (pdf_page_handle pdf_page);
Note that rowbytes must be at least (Columns+7)/8, but may be arbitrarily
large. */
void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
unsigned long Columns,
unsigned long Rows,
unsigned long rowbytes,
Bitmap *bitmap,
int ImageMask,
int BlackIs1, /* boolean, typ. false */
unsigned char *data,
unsigned long len);
int BlackIs1); /* boolean, typ. false */
void pdf_set_page_number (pdf_page_handle pdf_page, char *page_number);

View File

@@ -1,7 +1,36 @@
/*
* 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.
*
* PDF routines
* $Id: pdf_g4.c,v 1.3 2003/02/20 04:44:17 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 <stdio.h>
#include <string.h>
#include "bitblt.h"
#include "pdf.h"
#include "pdf_util.h"
#include "pdf_prim.h"
@@ -12,10 +41,8 @@ struct pdf_g4_image
{
unsigned long Columns;
unsigned long Rows;
unsigned long rowbytes;
int BlackIs1;
unsigned char *data;
unsigned long len;
Bitmap *bitmap;
char XObject_name [4];
};
@@ -69,23 +96,24 @@ void pdf_write_g4_fax_image_callback (pdf_file_handle pdf_file,
{
struct pdf_g4_image *image = app_data;
#if 1
#if 0
pdf_stream_write_data (pdf_file, stream, image->data, image->len);
#else
unsigned long row = 0;
unsigned char *ref;
unsigned char *raw;
word_type *ref;
word_type *raw;
ref = NULL;
raw = image->data;
raw = image->bitmap->bits;
while (row < image->Rows)
{
pdf_stream_write_data (pdf_file, stream, raw, image->rowbytes);
pdf_stream_write_data (pdf_file, stream, raw,
image->bitmap->row_words * sizeof (word_type));
row++;
ref = raw;
raw += image->rowbytes;
raw += image->bitmap->row_words;
}
/* $$$ generate and write EOFB code */
/* $$$ flush any remaining buffered bits */
@@ -94,13 +122,9 @@ void pdf_write_g4_fax_image_callback (pdf_file_handle pdf_file,
void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
unsigned long Columns,
unsigned long Rows,
unsigned long rowbytes,
Bitmap *bitmap,
int ImageMask,
int BlackIs1, /* boolean, typ. false */
unsigned char *data,
unsigned long len)
int BlackIs1) /* boolean, typ. false */
{
struct pdf_g4_image *image;
@@ -112,12 +136,10 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
image = pdf_calloc (sizeof (struct pdf_g4_image));
image->Columns = Columns;
image->Rows = Rows;
image->rowbytes = rowbytes;
image->bitmap = bitmap;
image->Columns = bitmap->rect.max.x - bitmap->rect.min.x;
image->Rows = bitmap->rect.max.y - bitmap->rect.min.y;
image->BlackIs1 = BlackIs1;
image->data = data;
image->len = len;
stream_dict = pdf_new_obj (PT_DICTIONARY);
@@ -133,8 +155,8 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
pdf_set_dict_entry (stream_dict, "Type", pdf_new_name ("XObject"));
pdf_set_dict_entry (stream_dict, "Subtype", pdf_new_name ("Image"));
pdf_set_dict_entry (stream_dict, "Name", pdf_new_name (& image->XObject_name [0]));
pdf_set_dict_entry (stream_dict, "Width", pdf_new_integer (Columns));
pdf_set_dict_entry (stream_dict, "Height", pdf_new_integer (Rows));
pdf_set_dict_entry (stream_dict, "Width", pdf_new_integer (image->Columns));
pdf_set_dict_entry (stream_dict, "Height", pdf_new_integer (image->Rows));
pdf_set_dict_entry (stream_dict, "BitsPerComponent", pdf_new_integer (1));
if (ImageMask)
pdf_set_dict_entry (stream_dict, "ImageMask", pdf_new_bool (ImageMask));
@@ -149,11 +171,11 @@ void pdf_write_g4_fax_image (pdf_page_handle pdf_page,
pdf_set_dict_entry (decode_parms,
"Columns",
pdf_new_integer (Columns));
pdf_new_integer (image->Columns));
pdf_set_dict_entry (decode_parms,
"Rows",
pdf_new_integer (Rows));
pdf_new_integer (image->Rows));
if (BlackIs1)
pdf_set_dict_entry (decode_parms,

View File

@@ -1,7 +1,36 @@
/*
* 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.
*
* PDF routines
* $Id: pdf_prim.c,v 1.3 2003/02/20 04:44:17 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 <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bitblt.h"
#include "pdf.h"
#include "pdf_util.h"
#include "pdf_prim.h"
@@ -60,7 +89,7 @@ struct pdf_obj
unsigned long ref_count;
pdf_obj_type type;
union {
int bool;
bool boolean;
char *name;
char *string;
unsigned long integer;
@@ -170,10 +199,10 @@ struct pdf_obj *pdf_new_obj (pdf_obj_type type)
}
struct pdf_obj *pdf_new_bool (int bool)
struct pdf_obj *pdf_new_bool (bool val)
{
struct pdf_obj *obj = pdf_new_obj (PT_BOOL);
obj->val.bool = bool;
obj->val.boolean = val;
return (obj);
}
@@ -450,7 +479,7 @@ void pdf_write_obj (pdf_file_handle pdf_file, struct pdf_obj *obj)
fprintf (pdf_file->f, "null ");
break;
case PT_BOOL:
if (obj->val.bool)
if (obj->val.boolean)
fprintf (pdf_file->f, "true ");
else
fprintf (pdf_file->f, "false ");

View File

@@ -1,3 +1,29 @@
/*
* 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.
*
* PDF routines
* $Id: pdf_prim.h,v 1.2 2003/02/20 04:44:17 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
*/
typedef enum
{
PT_BAD,
@@ -36,7 +62,7 @@ void pdf_add_array_elem (struct pdf_obj *array_obj, struct pdf_obj *val);
/* Create a new object that will NOT be used indirectly */
struct pdf_obj *pdf_new_obj (pdf_obj_type type);
struct pdf_obj *pdf_new_bool (int bool);
struct pdf_obj *pdf_new_bool (bool val);
struct pdf_obj *pdf_new_name (char *name);

View File

@@ -1,3 +1,29 @@
/*
* 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.
*
* PDF routines
* $Id: pdf_private.h,v 1.2 2003/02/20 04:44:17 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
*/
struct pdf_page
{
pdf_file_handle pdf_file;

View File

@@ -1,8 +1,37 @@
/*
* 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.
*
* PDF routines
* $Id: pdf_util.c,v 1.3 2003/02/20 04:44:17 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 <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "bitblt.h"
#include "pdf.h"
#include "pdf_util.h"

View File

@@ -1,3 +1,29 @@
/*
* 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.
*
* PDF routines
* $Id: pdf_util.h,v 1.2 2003/02/20 04:44:17 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
*/
void pdf_fatal (char *fmt, ...);
void *pdf_calloc (long int size);

124
t2p.c
View File

@@ -4,7 +4,7 @@
* will be compressed using ITU-T T.6 (G4) fax encoding.
*
* Main program
* $Id: t2p.c,v 1.21 2003/01/21 10:39:55 eric Exp $
* $Id: t2p.c,v 1.22 2003/02/20 04:44:17 eric Exp $
* Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -20,7 +20,8 @@
*
* 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 */
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
*/
#include <stdarg.h>
@@ -28,18 +29,17 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <tiffio.h>
#define TIFF_REVERSE_BITS
#include <panda/functions.h>
#include <panda/constants.h>
#include "bitblt.h"
#include "semantics.h"
#include "parser.tab.h"
#include "t2p.h"
#include "pdf.h"
#define MAX_INPUT_FILES 5000
@@ -55,7 +55,7 @@ typedef struct output_file_t
{
struct output_file_t *next;
char *name;
panda_pdf *pdf;
pdf_file_handle pdf;
} output_file_t;
@@ -66,7 +66,6 @@ char *in_filename;
TIFF *in;
output_file_t *output_files;
output_file_t *out;
/* panda_pdf *out; */
char *progname;
@@ -87,6 +86,10 @@ void usage (void)
fprintf (stderr, " %s [options] <input.tif>... -o <output.pdf>\n", progname);
fprintf (stderr, "options:\n");
fprintf (stderr, " -v verbose\n");
fprintf (stderr, " -b fmt create bookmarks\n");
fprintf (stderr, "bookmark format:\n");
fprintf (stderr, " %%F file name\n");
fprintf (stderr, " %%p page number\n");
}
@@ -158,7 +161,7 @@ bool close_pdf_output_files (void)
for (o = output_files; o; o = n)
{
n = o->next;
panda_close (o->pdf);
pdf_close (o->pdf);
free (o->name);
free (o);
}
@@ -195,7 +198,7 @@ bool open_pdf_output_file (char *name,
return (0);
}
o->pdf = panda_open (name, "w");
o->pdf = pdf_create (name);
if (! o->pdf)
{
fprintf (stderr, "can't open output file '%s'\n", name);
@@ -205,15 +208,15 @@ bool open_pdf_output_file (char *name,
}
if (attributes->author)
panda_setauthor (o->pdf, attributes->author);
pdf_set_author (o->pdf, attributes->author);
if (attributes->creator)
panda_setcreator (o->pdf, attributes->creator);
pdf_set_creator (o->pdf, attributes->creator);
if (attributes->title)
panda_settitle (o->pdf, attributes->title);
pdf_set_title (o->pdf, attributes->title);
if (attributes->subject)
panda_setsubject (o->pdf, attributes->subject);
pdf_set_subject (o->pdf, attributes->subject);
if (attributes->keywords)
panda_setkeywords (o->pdf, attributes->keywords);
pdf_set_keywords (o->pdf, attributes->keywords);
/* prepend new output file onto list */
o->next = output_files;
@@ -304,23 +307,15 @@ bool process_page (int image, /* range 1 .. n */
float x_resolution, y_resolution;
float dest_x_resolution, dest_y_resolution;
int width_points, height_points; /* really 1/72 inch units rather than
points */
double width_points, height_points; /* really 1/72 inch units rather than
points */
Rect rect;
Bitmap *bitmap;
int row;
panda_page *page;
int tiff_temp_fd;
char tiff_temp_fn [] = "/var/tmp/t2p-XXXXXX\0";
TIFF *tiff_temp;
char pagesize [26]; /* Needs to hold two ints of four characters (0..3420),
two zeros, three spaces, two brackets, and a NULL.
Added an extra ten characters just in case. */
pdf_page_handle page;
if (! TIFFSetDirectory (in, image - 1))
{
@@ -406,7 +401,7 @@ bool process_page (int image, /* range 1 .. n */
dest_image_length = image_width;
dest_x_resolution = y_resolution;
dest_y_resolution = x_resolution;
SWAP (int, width_points, height_points);
SWAP (double, width_points, height_points); /* $$$ not yet set!!! */
}
else
{
@@ -453,80 +448,32 @@ bool process_page (int image, /* range 1 .. n */
rotate_bitmap (bitmap,
input_attributes);
tiff_temp_fd = mkstemp (tiff_temp_fn);
if (tiff_temp_fd < 0)
{
fprintf (stderr, "can't create temporary TIFF file\n");
goto fail;
}
tiff_temp = TIFFFdOpen (tiff_temp_fd, tiff_temp_fn, "w");
if (! out)
{
fprintf (stderr, "can't open temporary TIFF file '%s'\n", tiff_temp_fn);
goto fail;
}
TIFFSetField (tiff_temp, TIFFTAG_IMAGELENGTH, rect_height (& bitmap->rect));
TIFFSetField (tiff_temp, TIFFTAG_IMAGEWIDTH, rect_width (& bitmap->rect));
TIFFSetField (tiff_temp, TIFFTAG_PLANARCONFIG, planar_config);
TIFFSetField (tiff_temp, TIFFTAG_ROWSPERSTRIP, rect_height (& bitmap->rect));
TIFFSetField (tiff_temp, TIFFTAG_RESOLUTIONUNIT, resolution_unit);
TIFFSetField (tiff_temp, TIFFTAG_XRESOLUTION, dest_x_resolution);
TIFFSetField (tiff_temp, TIFFTAG_YRESOLUTION, dest_y_resolution);
TIFFSetField (tiff_temp, TIFFTAG_SAMPLESPERPIXEL, samples_per_pixel);
TIFFSetField (tiff_temp, TIFFTAG_BITSPERSAMPLE, bits_per_sample);
TIFFSetField (tiff_temp, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
TIFFSetField (tiff_temp, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
#ifdef TIFF_REVERSE_BITS
reverse_bits ((uint8_t *) bitmap->bits,
image_length * bitmap->row_words * sizeof (word_type));
#endif /* TIFF_REVERSE_BITS */
for (row = 0; row < rect_height (& bitmap->rect); row++)
if (1 != TIFFWriteScanline (tiff_temp,
bitmap->bits + row * bitmap->row_words,
row,
0))
{
fprintf (stderr, "can't write TIFF scanline\n");
goto fail;
}
TIFFClose (tiff_temp);
width_points = (rect_width (& bitmap->rect) / dest_x_resolution) * POINTS_PER_INCH;
height_points = (rect_height (& bitmap->rect) / dest_y_resolution) * POINTS_PER_INCH;
free_bitmap (bitmap);
if ((height_points > PAGE_MAX_POINTS) || (width_points > PAGE_MAX_POINTS))
{
fprintf (stdout, "image too large (max %d inches on a side\n", PAGE_MAX_INCHES);
goto fail;
}
sprintf (pagesize, "[0 0 %d %d]", width_points, height_points);
page = pdf_new_page (out->pdf, width_points, height_points);
page = panda_newpage (out->pdf, pagesize);
panda_imagebox (out->pdf,
page,
0, /* top */
0, /* left */
height_points, /* bottom */
width_points, /* right */
tiff_temp_fn,
panda_image_tiff);
pdf_write_g4_fax_image (page,
bitmap,
0, /* ImageMask */
0); /* BlackIs1 */
free_bitmap (bitmap);
result = 1;
fail:
if (tiff_temp_fd)
unlink (tiff_temp_fn);
return (result);
}
@@ -548,6 +495,7 @@ void main_args (char *out_fn, int inf_count, char **in_fn)
fatal (3, "error opening input file \"%s\"\n", in_fn [i]);
for (ip = 1;; ip++)
{
fprintf (stderr, "processing page %d of file \"%s\"\r", ip, in_fn [i]);
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 ())
@@ -576,12 +524,13 @@ int main (int argc, char *argv[])
{
char *spec_fn = NULL;
char *out_fn = NULL;
char *bookmark_fmt = NULL;
int inf_count = 0;
char *in_fn [MAX_INPUT_FILES];
progname = argv [0];
panda_init ();
pdf_init ();
while (--argc)
{
@@ -611,6 +560,17 @@ int main (int argc, char *argv[])
else
fatal (1, "missing filename after \"-s\" option\n");
}
else if (strcmp (argv [1], "-b") == 0)
{
if (argc)
{
argc--;
argv++;
bookmark_fmt = argv [1];
}
else
fatal (1, "missing format string after \"-b\" option\n");
}
else
fatal (1, "unrecognized option \"%s\"\n", argv [1]);
}

124
tumble.c
View File

@@ -4,7 +4,7 @@
* will be compressed using ITU-T T.6 (G4) fax encoding.
*
* Main program
* $Id: tumble.c,v 1.21 2003/01/21 10:39:55 eric Exp $
* $Id: tumble.c,v 1.22 2003/02/20 04:44:17 eric Exp $
* Copyright 2001, 2002, 2003 Eric Smith <eric@brouhaha.com>
*
* This program is free software; you can redistribute it and/or modify
@@ -20,7 +20,8 @@
*
* 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 */
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA
*/
#include <stdarg.h>
@@ -28,18 +29,17 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <tiffio.h>
#define TIFF_REVERSE_BITS
#include <panda/functions.h>
#include <panda/constants.h>
#include "bitblt.h"
#include "semantics.h"
#include "parser.tab.h"
#include "t2p.h"
#include "pdf.h"
#define MAX_INPUT_FILES 5000
@@ -55,7 +55,7 @@ typedef struct output_file_t
{
struct output_file_t *next;
char *name;
panda_pdf *pdf;
pdf_file_handle pdf;
} output_file_t;
@@ -66,7 +66,6 @@ char *in_filename;
TIFF *in;
output_file_t *output_files;
output_file_t *out;
/* panda_pdf *out; */
char *progname;
@@ -87,6 +86,10 @@ void usage (void)
fprintf (stderr, " %s [options] <input.tif>... -o <output.pdf>\n", progname);
fprintf (stderr, "options:\n");
fprintf (stderr, " -v verbose\n");
fprintf (stderr, " -b fmt create bookmarks\n");
fprintf (stderr, "bookmark format:\n");
fprintf (stderr, " %%F file name\n");
fprintf (stderr, " %%p page number\n");
}
@@ -158,7 +161,7 @@ bool close_pdf_output_files (void)
for (o = output_files; o; o = n)
{
n = o->next;
panda_close (o->pdf);
pdf_close (o->pdf);
free (o->name);
free (o);
}
@@ -195,7 +198,7 @@ bool open_pdf_output_file (char *name,
return (0);
}
o->pdf = panda_open (name, "w");
o->pdf = pdf_create (name);
if (! o->pdf)
{
fprintf (stderr, "can't open output file '%s'\n", name);
@@ -205,15 +208,15 @@ bool open_pdf_output_file (char *name,
}
if (attributes->author)
panda_setauthor (o->pdf, attributes->author);
pdf_set_author (o->pdf, attributes->author);
if (attributes->creator)
panda_setcreator (o->pdf, attributes->creator);
pdf_set_creator (o->pdf, attributes->creator);
if (attributes->title)
panda_settitle (o->pdf, attributes->title);
pdf_set_title (o->pdf, attributes->title);
if (attributes->subject)
panda_setsubject (o->pdf, attributes->subject);
pdf_set_subject (o->pdf, attributes->subject);
if (attributes->keywords)
panda_setkeywords (o->pdf, attributes->keywords);
pdf_set_keywords (o->pdf, attributes->keywords);
/* prepend new output file onto list */
o->next = output_files;
@@ -304,23 +307,15 @@ bool process_page (int image, /* range 1 .. n */
float x_resolution, y_resolution;
float dest_x_resolution, dest_y_resolution;
int width_points, height_points; /* really 1/72 inch units rather than
points */
double width_points, height_points; /* really 1/72 inch units rather than
points */
Rect rect;
Bitmap *bitmap;
int row;
panda_page *page;
int tiff_temp_fd;
char tiff_temp_fn [] = "/var/tmp/t2p-XXXXXX\0";
TIFF *tiff_temp;
char pagesize [26]; /* Needs to hold two ints of four characters (0..3420),
two zeros, three spaces, two brackets, and a NULL.
Added an extra ten characters just in case. */
pdf_page_handle page;
if (! TIFFSetDirectory (in, image - 1))
{
@@ -406,7 +401,7 @@ bool process_page (int image, /* range 1 .. n */
dest_image_length = image_width;
dest_x_resolution = y_resolution;
dest_y_resolution = x_resolution;
SWAP (int, width_points, height_points);
SWAP (double, width_points, height_points); /* $$$ not yet set!!! */
}
else
{
@@ -453,80 +448,32 @@ bool process_page (int image, /* range 1 .. n */
rotate_bitmap (bitmap,
input_attributes);
tiff_temp_fd = mkstemp (tiff_temp_fn);
if (tiff_temp_fd < 0)
{
fprintf (stderr, "can't create temporary TIFF file\n");
goto fail;
}
tiff_temp = TIFFFdOpen (tiff_temp_fd, tiff_temp_fn, "w");
if (! out)
{
fprintf (stderr, "can't open temporary TIFF file '%s'\n", tiff_temp_fn);
goto fail;
}
TIFFSetField (tiff_temp, TIFFTAG_IMAGELENGTH, rect_height (& bitmap->rect));
TIFFSetField (tiff_temp, TIFFTAG_IMAGEWIDTH, rect_width (& bitmap->rect));
TIFFSetField (tiff_temp, TIFFTAG_PLANARCONFIG, planar_config);
TIFFSetField (tiff_temp, TIFFTAG_ROWSPERSTRIP, rect_height (& bitmap->rect));
TIFFSetField (tiff_temp, TIFFTAG_RESOLUTIONUNIT, resolution_unit);
TIFFSetField (tiff_temp, TIFFTAG_XRESOLUTION, dest_x_resolution);
TIFFSetField (tiff_temp, TIFFTAG_YRESOLUTION, dest_y_resolution);
TIFFSetField (tiff_temp, TIFFTAG_SAMPLESPERPIXEL, samples_per_pixel);
TIFFSetField (tiff_temp, TIFFTAG_BITSPERSAMPLE, bits_per_sample);
TIFFSetField (tiff_temp, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
TIFFSetField (tiff_temp, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
#ifdef TIFF_REVERSE_BITS
reverse_bits ((uint8_t *) bitmap->bits,
image_length * bitmap->row_words * sizeof (word_type));
#endif /* TIFF_REVERSE_BITS */
for (row = 0; row < rect_height (& bitmap->rect); row++)
if (1 != TIFFWriteScanline (tiff_temp,
bitmap->bits + row * bitmap->row_words,
row,
0))
{
fprintf (stderr, "can't write TIFF scanline\n");
goto fail;
}
TIFFClose (tiff_temp);
width_points = (rect_width (& bitmap->rect) / dest_x_resolution) * POINTS_PER_INCH;
height_points = (rect_height (& bitmap->rect) / dest_y_resolution) * POINTS_PER_INCH;
free_bitmap (bitmap);
if ((height_points > PAGE_MAX_POINTS) || (width_points > PAGE_MAX_POINTS))
{
fprintf (stdout, "image too large (max %d inches on a side\n", PAGE_MAX_INCHES);
goto fail;
}
sprintf (pagesize, "[0 0 %d %d]", width_points, height_points);
page = pdf_new_page (out->pdf, width_points, height_points);
page = panda_newpage (out->pdf, pagesize);
panda_imagebox (out->pdf,
page,
0, /* top */
0, /* left */
height_points, /* bottom */
width_points, /* right */
tiff_temp_fn,
panda_image_tiff);
pdf_write_g4_fax_image (page,
bitmap,
0, /* ImageMask */
0); /* BlackIs1 */
free_bitmap (bitmap);
result = 1;
fail:
if (tiff_temp_fd)
unlink (tiff_temp_fn);
return (result);
}
@@ -548,6 +495,7 @@ void main_args (char *out_fn, int inf_count, char **in_fn)
fatal (3, "error opening input file \"%s\"\n", in_fn [i]);
for (ip = 1;; ip++)
{
fprintf (stderr, "processing page %d of file \"%s\"\r", ip, in_fn [i]);
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 ())
@@ -576,12 +524,13 @@ int main (int argc, char *argv[])
{
char *spec_fn = NULL;
char *out_fn = NULL;
char *bookmark_fmt = NULL;
int inf_count = 0;
char *in_fn [MAX_INPUT_FILES];
progname = argv [0];
panda_init ();
pdf_init ();
while (--argc)
{
@@ -611,6 +560,17 @@ int main (int argc, char *argv[])
else
fatal (1, "missing filename after \"-s\" option\n");
}
else if (strcmp (argv [1], "-b") == 0)
{
if (argc)
{
argc--;
argv++;
bookmark_fmt = argv [1];
}
else
fatal (1, "missing format string after \"-b\" option\n");
}
else
fatal (1, "unrecognized option \"%s\"\n", argv [1]);
}