/* * pdf_make.c * * Version 1.1 -- September 21, 2005 -- Pius Fischer * * Version history: * 1.0 05 Aug 2005 First version * 1.1 21 Sep 2005 Added ability to specify the stream filename prefix */ #include #include #include #include #include static char linebuffer[256]; static long filepos; static long objpos[128]; static unsigned int numobj; void die(const char *fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); exit(1); } void read_and_write_stream(const char *_stream_filename_prefix) { size_t stream_len; static char stream_buffer[16384]; static char stream_filename[128]; FILE * stream_file; snprintf(stream_filename, sizeof(stream_filename), "%s.%u", _stream_filename_prefix, numobj); if ((stream_file = fopen(stream_filename, "r")) == NULL) die("Cannot open %s: %s\n", stream_filename, strerror(errno)); if (fseek(stream_file, 0, SEEK_END) != 0) die("fseek to end of file failed: %s\n", strerror(errno)); if ((stream_len = ftell(stream_file)) < 0) die("ftell at end of file failed: %s\n", strerror(errno)); if (fseek(stream_file, 0, SEEK_SET) != 0) die("fseek failed: %s\n", strerror(errno)); filepos += printf("<<\n\t/Length %u\n", stream_len); filepos += printf("\t/Filter /FlateDecode\n>>\n"); filepos += printf("stream\n"); while (stream_len) { size_t read_len = sizeof(stream_buffer); if (stream_len < read_len) read_len = stream_len; fread(stream_buffer, read_len, 1, stream_file); fwrite(stream_buffer, read_len, 1, stdout); stream_len -= read_len; filepos += read_len; } fclose(stream_file); filepos += printf("\n"); } void write_trailer(void) { int i; printf("xref\n0 %u\n", numobj + 1); printf("%010u 65535 f \n", 0); for (i = 1; i <= numobj; ++i) printf("%010u 00000 n \n", objpos[i]); printf("trailer\n"); printf("<<\t/Size %u\n", numobj + 1); printf("\t/Root 1 0 R\n"); printf(">>\n"); printf("startxref\n%ld\n%%%%EOF\n", filepos); } int main(int argc, char **argv) { FILE *file; char *stream_filename_prefix = "stream"; if (argc < 2 || argc > 3) die("Usage: %s