1 /*---------------------------------------------------------------------------* 2 | PDFlib - A library for generating PDF on the fly | 3 +---------------------------------------------------------------------------+ 4 | Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. | 5 +---------------------------------------------------------------------------+ 6 | | 7 | This software is subject to the PDFlib license. It is NOT in the | 8 | public domain. Extended versions and commercial licenses are | 9 | available, please check http://www.pdflib.com. | 10 | | 11 *---------------------------------------------------------------------------*/ 12 13 /* $Id: pc_output.h,v 1.72.2.8 2009/10/23 11:10:12 stm Exp $ 14 * 15 * PDFlib output defines and routines 16 * 17 */ 18 19 #ifndef PC_OUTPUT_H 20 #define PC_OUTPUT_H 21 22 /* Define to test special MVS output features */ 23 #undef MVS_TEST 24 25 /* -------------------- some ASCII characters and strings ------------- */ 26 27 #define PDF_NEWLINE ((char) 0x0A) /* ASCII '\n' */ 28 #define PDF_RETURN ((char) 0x0D) /* ASCII '\r' */ 29 #define PDF_SPACE ((char) 0x20) /* ASCII ' ' */ 30 #define PDF_HASH ((char) 0x23) /* ASCII '#' */ 31 #define PDF_PARENLEFT ((char) 0x28) /* ASCII '(' */ 32 #define PDF_PARENRIGHT ((char) 0x29) /* ASCII ')' */ 33 #define PDF_PLUS ((char) 0x2B) /* ASCII '+' */ 34 #define PDF_SLASH ((char) 0x2F) /* ASCII '/' */ 35 #define PDF_COLON ((char) 0x3A) /* ASCII ':' */ 36 #define PDF_BACKSLASH ((char) 0x5C) /* ASCII '\\' */ 37 38 #define PDF_A ((char) 0x41) /* ASCII 'A' */ 39 #define PDF_n ((char) 0x6E) /* ASCII 'n' */ 40 #define PDF_r ((char) 0x72) /* ASCII 'r' */ 41 42 #define PDF_STRING_0123456789ABCDEF \ 43 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x41\x42\x43\x44\x45\x46" 44 45 46 /* ------------------------ some PDF constant -------------------------- */ 47 48 /* Acrobat viewers change absolute values < 1/65536 to zero */ 49 #define PDF_SMALLREAL (0.000015) 50 51 /* Acrobat viewers have an upper limit on real and integer numbers */ 52 #define PDF_BIGREAL (32768.0) 53 #define PDF_BIGINT (2147483647.0) 54 55 /* maximum capacity of a dictionary, in entries */ 56 #define PDF_MAXDICTSIZE (4095) 57 58 /* maximum capacity of an array, in elements */ 59 #define PDF_MAXARRAYSIZE (8191) 60 61 /* maximum capacity of a text string in content stream for Tj, in bytes 62 * PDF Reference, TABLE C.1: 32767 63 * But an error will occur: "Token type not recognized" 64 */ 65 #define PDF_MAXTEXTSIZE (32763) 66 67 /* maximum capacity of a string, in bytes */ 68 #define PDF_MAXSTRINGSIZE (65535) 69 70 /* maximum capacity of indirect objects */ 71 #define PDF_MAXINDOBJS (8388607) 72 73 /* Acrobat limit for page dimensions */ 74 #define PDF_ACRO_MINPAGE (3.0) /* 1/24 inch = 0.106 cm */ 75 #define PDF_ACRO_MAXPAGE (14400.0) /* 200 inch = 508 cm */ 76 77 /* PDF versions */ 78 #define PDC_1_1 11 /* PDF 1.1 = Acrobat 2 */ 79 #define PDC_1_2 12 /* PDF 1.2 = Acrobat 3 */ 80 #define PDC_1_3 13 /* PDF 1.3 = Acrobat 4 */ 81 #define PDC_1_4 14 /* PDF 1.4 = Acrobat 5 */ 82 #define PDC_1_5 15 /* PDF 1.5 = Acrobat 6 */ 83 #define PDC_1_6 16 /* PDF 1.6 = Acrobat 7 */ 84 #define PDC_1_7 17 /* PDF 1.7 = Acrobat 8 */ 85 #define PDC_X_X_LAST 17 86 87 88 /* ------------------- some defines for special PDFs ----------------------- */ 89 90 91 92 93 /* ------------------- some special enumerations -------------------------- */ 94 95 96 typedef enum 97 { 98 pdc_pbox_none, 99 pdc_pbox_art, 100 pdc_pbox_bleed, 101 pdc_pbox_crop, 102 pdc_pbox_media, 103 pdc_pbox_trim 104 } 105 pdc_pagebox; 106 107 108 /* ----------------------- PDF output ---------------------------- */ 109 110 typedef struct pdc_output_s pdc_output; 111 112 typedef enum 113 { 114 pdc_flush_none = 0, /* end of document */ 115 pdc_flush_page = 1<<0, /* after page */ 116 pdc_flush_content = 1<<1, /* font, xobj, annots */ 117 118 /* temporary workaround; see bugzilla #167. 119 */ 120 /* pdc_flush_heavy = 1<<4 before realloc attempt */ 121 pdc_flush_heavy = pdc_flush_page | pdc_flush_content 122 } 123 pdc_flush_state; 124 125 /* output control. 126 */ 127 typedef struct 128 { 129 /* exactly one of the members 'filename', 'fp', and 'writeproc' 130 ** must be supplied, the others must be NULL: 131 ** 132 ** filename use supplied file name to create a named output file 133 ** filename == "" means generate output in-core 134 ** fp use supplied FILE * to write to file 135 ** writeproc use supplied procedure to write output data 136 */ 137 const char *filename; 138 FILE * fp; 139 size_t (*writeproc)(pdc_output *out, void *data, size_t size); 140 141 pdc_flush_state flush; 142 143 144 145 146 #if defined(MVS) || defined(MVS_TEST) 147 const char *fopenparams; /* additional fopen() parameters */ 148 int recordsize; /* file record size */ 149 #endif 150 } pdc_outctl; 151 152 153 /* ----------- service function to get PDF version string -------------- */ 154 155 const char *pdc_get_pdfversion(pdc_core *pdc, int compatibility); 156 157 158 /* --------------------------- Setup --------------------------- */ 159 160 pdc_output * pdc_boot_output(pdc_core *pdc); 161 void pdc_init_outctl(pdc_outctl *oc); 162 pdc_bool pdc_init_output(void *opaque, pdc_output *out, 163 int compatibility, pdc_outctl *oc); 164 void pdc_cleanup_output(pdc_output *out, pdc_bool keep_buf); 165 void * pdc_get_opaque(pdc_output *out); 166 167 /* --------------------------- Digest --------------------------- */ 168 169 void pdc_init_digest(pdc_output *out); 170 void pdc_update_digest(pdc_output *out, unsigned char *input, 171 unsigned int len); 172 void pdc_finish_digest(pdc_output *out, pdc_bool settime); 173 unsigned char * pdc_get_digest(pdc_output *out); 174 175 176 /* --------------------------- Objects and ids --------------------------- */ 177 178 pdc_id pdc_alloc_id(pdc_output *out); 179 pdc_id pdc_map_id(pdc_output *out, pdc_id old_id); 180 void pdc_mark_free(pdc_output *out, pdc_id obj_id); 181 182 pdc_id pdc_begin_obj(pdc_output *out, pdc_id obj_id); 183 #define pdc_end_obj(out) pdc_puts(out, "endobj\n") 184 185 #define PDC_NEW_ID 0L 186 #define PDC_BAD_ID -1L 187 #define PDC_FREE_ID -2L 188 189 190 /* --------------------------- Strings --------------------------- */ 191 /* output a string (including parentheses) and quote all required characters */ 192 void pdc_put_pdfstring(pdc_output *out, const char *text, int len); 193 void pdc_put_pdffilename(pdc_output *out, const char *text, int len); 194 195 196 /* --------------------------- Names --------------------------- */ 197 /* output a PDF name (including leading slash) and quote all required chars */ 198 void pdc_put_pdfname(pdc_output *out, const char *text, size_t len); 199 200 201 /* --------------------------- Arrays --------------------------- */ 202 #define pdc_begin_array(out) pdc_puts(out, "[") 203 #define pdc_end_array(out) pdc_puts(out, "]\n") 204 #define pdc_end_array_c(out) pdc_puts(out, "]") 205 206 207 /* --------------------------- Dictionaries --------------------------- */ 208 #define pdc_begin_dict(out) pdc_puts(out, "<<") 209 #define pdc_end_dict(out) pdc_puts(out, ">>\n") 210 #define pdc_end_dict_c(out) pdc_puts(out, ">>") 211 212 213 /* --------------------------- Object References --------------------------- */ 214 #define pdc_objref(out, name, obj_id) \ 215 pdc_printf(out, "%s %ld 0 R\n", name, obj_id) 216 217 #define pdc_objref_c(out, obj_id) \ 218 pdc_printf(out, " %ld 0 R", obj_id) 219 220 #define pdc_objref_c2(out, obj_id, gen_no) \ 221 pdc_printf(out, " %ld %d R", obj_id, gen_no) 222 223 /* --------------------------- Streams --------------------------- */ 224 void pdc_begin_pdfstream(pdc_output *out); 225 void pdc_end_pdfstream(pdc_output *out); 226 pdc_off_t pdc_get_pdfstreamlength(pdc_output *out); 227 void pdc_put_pdfstreamlength(pdc_output *out, pdc_id length_id); 228 229 int pdc_get_compresslevel(pdc_output *out); 230 void pdc_set_compresslevel(pdc_output *out, int compresslevel); 231 232 233 234 /* --------------------------- Document sections --------------------------- */ 235 void pdc_write_xref(pdc_output *out); 236 237 void pdc_write_digest(pdc_output *out); 238 void pdc_write_trailer(pdc_output *out, pdc_id info_id, 239 pdc_id root_id, int root_gen, long xref_size, 240 pdc_off_t xref_prev, pdc_off_t xref_pos); 241 void pdc_write_eof(pdc_output *out); 242 243 244 /* --------------------------- Low-level output --------------------------- */ 245 void pdc_flush_stream(pdc_output *out); 246 pdc_off_t pdc_tell_out(pdc_output *out); 247 void pdc_close_output(pdc_output *out); 248 /* TODO2GB: size_t? */ 249 char * pdc_get_stream_contents(pdc_output *out, pdc_off_t *size); 250 int pdc_stream_not_empty(pdc_output *out); 251 252 void pdc_write(pdc_output *out, const void *data, size_t size); 253 void pdc_puts(pdc_output *out, const char *s); 254 void pdc_putc(pdc_output *out, const char c); 255 256 257 /* ------------------------- High-level output ------------------------- */ 258 void pdc_printf(pdc_output *out, const char *fmt, ...); 259 260 #endif /* PC_OUTPUT_H */ 261 262