2006-05-04 16:36:51 +00:00
|
|
|
/*---------------------------------------------------------------------------*
|
|
|
|
| PDFlib - A library for generating PDF on the fly |
|
|
|
|
+---------------------------------------------------------------------------+
|
2008-10-20 14:35:00 +00:00
|
|
|
| Copyright (c) 1997-2006 Thomas Merz and PDFlib GmbH. All rights reserved. |
|
2006-05-04 16:36:51 +00:00
|
|
|
+---------------------------------------------------------------------------+
|
|
|
|
| |
|
|
|
|
| This software is subject to the PDFlib license. It is NOT in the |
|
|
|
|
| public domain. Extended versions and commercial licenses are |
|
|
|
|
| available, please check http://www.pdflib.com. |
|
|
|
|
| |
|
|
|
|
*---------------------------------------------------------------------------*/
|
|
|
|
|
2009-03-23 08:55:58 +00:00
|
|
|
/* $Id: pc_output.h,v 1.4 2009-03-23 08:51:17 guy Exp $
|
2006-05-04 16:36:51 +00:00
|
|
|
*
|
2009-03-23 08:55:58 +00:00
|
|
|
* PDFlib output defines and routines
|
2006-05-04 16:36:51 +00:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef PC_OUTPUT_H
|
|
|
|
#define PC_OUTPUT_H
|
|
|
|
|
2008-10-20 14:35:00 +00:00
|
|
|
/* Define to test special MVS output features */
|
|
|
|
#undef MVS_TEST
|
|
|
|
|
2009-03-23 08:55:58 +00:00
|
|
|
/* -------------------- some ASCII characters and strings ------------- */
|
|
|
|
|
|
|
|
#define PDF_NEWLINE ((char) 0x0A) /* ASCII '\n' */
|
|
|
|
#define PDF_RETURN ((char) 0x0D) /* ASCII '\r' */
|
|
|
|
#define PDF_SPACE ((char) 0x20) /* ASCII ' ' */
|
|
|
|
#define PDF_HASH ((char) 0x23) /* ASCII '#' */
|
|
|
|
#define PDF_PARENLEFT ((char) 0x28) /* ASCII '(' */
|
|
|
|
#define PDF_PARENRIGHT ((char) 0x29) /* ASCII ')' */
|
|
|
|
#define PDF_PLUS ((char) 0x2B) /* ASCII '+' */
|
|
|
|
#define PDF_SLASH ((char) 0x2F) /* ASCII '/' */
|
|
|
|
#define PDF_COLON ((char) 0x3A) /* ASCII ':' */
|
|
|
|
#define PDF_BACKSLASH ((char) 0x5C) /* ASCII '\\' */
|
|
|
|
|
|
|
|
#define PDF_A ((char) 0x41) /* ASCII 'A' */
|
|
|
|
#define PDF_n ((char) 0x6E) /* ASCII 'n' */
|
|
|
|
#define PDF_r ((char) 0x72) /* ASCII 'r' */
|
|
|
|
|
|
|
|
#define PDF_STRING_0123456789ABCDEF \
|
|
|
|
"\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x41\x42\x43\x44\x45\x46"
|
|
|
|
|
|
|
|
|
|
|
|
/* ------------------------ some PDF constant -------------------------- */
|
|
|
|
|
2006-05-04 16:36:51 +00:00
|
|
|
/* Acrobat viewers change absolute values < 1/65536 to zero */
|
|
|
|
#define PDF_SMALLREAL (0.000015)
|
|
|
|
|
|
|
|
/* Acrobat viewers have an upper limit on real and integer numbers */
|
|
|
|
#define PDF_BIGREAL (32768.0)
|
|
|
|
#define PDF_BIGINT (2147483647.0)
|
|
|
|
|
|
|
|
/* maximum capacity of a dictionary, in entries */
|
|
|
|
#define PDF_MAXDICTSIZE (4095)
|
|
|
|
|
|
|
|
/* maximum capacity of an array, in elements */
|
|
|
|
#define PDF_MAXARRAYSIZE (8191)
|
|
|
|
|
2008-10-20 14:35:00 +00:00
|
|
|
/* maximum capacity of a text string in content stream for Tj, in bytes
|
|
|
|
* PDF Reference, TABLE C.1: 32767
|
|
|
|
* But an error will occur: "Token type not recognized"
|
|
|
|
*/
|
|
|
|
#define PDF_MAXTEXTSIZE (32763)
|
|
|
|
|
2006-05-04 16:36:51 +00:00
|
|
|
/* maximum capacity of a string, in bytes */
|
|
|
|
#define PDF_MAXSTRINGSIZE (65535)
|
|
|
|
|
2008-10-20 14:35:00 +00:00
|
|
|
/* maximum capacity of indirect objects */
|
|
|
|
#define PDF_MAXINDOBJS (8388607)
|
|
|
|
|
2009-03-23 08:55:58 +00:00
|
|
|
/* Acrobat limit for page dimensions */
|
|
|
|
#define PDF_ACRO_MINPAGE (3.0) /* 1/24 inch = 0.106 cm */
|
|
|
|
#define PDF_ACRO_MAXPAGE (14400.0) /* 200 inch = 508 cm */
|
2006-05-04 16:36:51 +00:00
|
|
|
|
2009-03-23 08:55:58 +00:00
|
|
|
/* PDF versions */
|
|
|
|
#define PDC_1_1 11 /* PDF 1.1 = Acrobat 2 */
|
|
|
|
#define PDC_1_2 12 /* PDF 1.2 = Acrobat 3 */
|
|
|
|
#define PDC_1_3 13 /* PDF 1.3 = Acrobat 4 */
|
|
|
|
#define PDC_1_4 14 /* PDF 1.4 = Acrobat 5 */
|
|
|
|
#define PDC_1_5 15 /* PDF 1.5 = Acrobat 6 */
|
|
|
|
#define PDC_1_6 16 /* PDF 1.6 = Acrobat 7 */
|
|
|
|
#define PDC_1_7 17 /* PDF 1.7 = Acrobat 8 */
|
|
|
|
#define PDC_X_X_LAST 17
|
2006-05-04 16:36:51 +00:00
|
|
|
|
|
|
|
|
2009-03-23 08:55:58 +00:00
|
|
|
/* ------------------- some defines for special PDFs ----------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ------------------- some special enumerations -------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
pdc_pbox_none,
|
|
|
|
pdc_pbox_art,
|
|
|
|
pdc_pbox_bleed,
|
|
|
|
pdc_pbox_crop,
|
|
|
|
pdc_pbox_media,
|
|
|
|
pdc_pbox_trim
|
|
|
|
}
|
|
|
|
pdc_pagebox;
|
|
|
|
|
|
|
|
|
|
|
|
/* ----------------------- PDF output ---------------------------- */
|
2006-05-04 16:36:51 +00:00
|
|
|
|
|
|
|
typedef struct pdc_output_s pdc_output;
|
|
|
|
|
2008-10-20 14:35:00 +00:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
pdc_flush_none = 0, /* end of document */
|
|
|
|
pdc_flush_page = 1<<0, /* after page */
|
|
|
|
pdc_flush_content = 1<<1, /* font, xobj, annots */
|
|
|
|
|
|
|
|
/* temporary workaround; see bugzilla #167.
|
|
|
|
*/
|
|
|
|
/* pdc_flush_heavy = 1<<4 before realloc attempt */
|
|
|
|
pdc_flush_heavy = pdc_flush_page | pdc_flush_content
|
|
|
|
}
|
|
|
|
pdc_flush_state;
|
|
|
|
|
2006-05-04 16:36:51 +00:00
|
|
|
/* output control.
|
|
|
|
*/
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
/* exactly one of the members 'filename', 'fp', and 'writeproc'
|
|
|
|
** must be supplied, the others must be NULL:
|
|
|
|
**
|
|
|
|
** filename use supplied file name to create a named output file
|
|
|
|
** filename == "" means generate output in-core
|
|
|
|
** fp use supplied FILE * to write to file
|
|
|
|
** writeproc use supplied procedure to write output data
|
|
|
|
*/
|
|
|
|
const char *filename;
|
|
|
|
FILE * fp;
|
|
|
|
size_t (*writeproc)(pdc_output *out, void *data, size_t size);
|
2008-10-20 14:35:00 +00:00
|
|
|
|
|
|
|
pdc_flush_state flush;
|
2006-05-04 16:36:51 +00:00
|
|
|
#if defined(MVS) || defined(MVS_TEST)
|
2008-10-20 14:35:00 +00:00
|
|
|
const char *fopenparams; /* additional fopen() parameters */
|
|
|
|
int recordsize; /* file record size */
|
2006-05-04 16:36:51 +00:00
|
|
|
#endif
|
|
|
|
} pdc_outctl;
|
|
|
|
|
2009-03-23 08:55:58 +00:00
|
|
|
|
|
|
|
/* ----------- service function to get PDF version string -------------- */
|
|
|
|
|
|
|
|
const char *pdc_get_pdfversion(pdc_core *pdc, int compatibility);
|
|
|
|
|
|
|
|
|
2006-05-04 16:36:51 +00:00
|
|
|
/* --------------------------- Setup --------------------------- */
|
|
|
|
|
|
|
|
pdc_output * pdc_boot_output(pdc_core *pdc);
|
|
|
|
void pdc_init_outctl(pdc_outctl *oc);
|
|
|
|
pdc_bool pdc_init_output(void *opaque, pdc_output *out,
|
|
|
|
int compatibility, pdc_outctl *oc);
|
|
|
|
void pdc_cleanup_output(pdc_output *out, pdc_bool keep_buf);
|
|
|
|
void * pdc_get_opaque(pdc_output *out);
|
|
|
|
|
|
|
|
/* --------------------------- Digest --------------------------- */
|
|
|
|
|
|
|
|
void pdc_init_digest(pdc_output *out);
|
|
|
|
void pdc_update_digest(pdc_output *out, unsigned char *input,
|
|
|
|
unsigned int len);
|
|
|
|
void pdc_finish_digest(pdc_output *out, pdc_bool settime);
|
|
|
|
unsigned char * pdc_get_digest(pdc_output *out);
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- Objects and ids --------------------------- */
|
|
|
|
|
|
|
|
pdc_id pdc_alloc_id(pdc_output *out);
|
|
|
|
pdc_id pdc_map_id(pdc_output *out, pdc_id old_id);
|
|
|
|
void pdc_mark_free(pdc_output *out, pdc_id obj_id);
|
|
|
|
|
|
|
|
pdc_id pdc_begin_obj(pdc_output *out, pdc_id obj_id);
|
|
|
|
#define pdc_end_obj(out) pdc_puts(out, "endobj\n")
|
|
|
|
|
|
|
|
#define PDC_NEW_ID 0L
|
|
|
|
#define PDC_BAD_ID -1L
|
|
|
|
#define PDC_FREE_ID -2L
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- Strings --------------------------- */
|
|
|
|
/* output a string (including parentheses) and quote all required characters */
|
|
|
|
void pdc_put_pdfstring(pdc_output *out, const char *text, int len);
|
|
|
|
void pdc_put_pdffilename(pdc_output *out, const char *text, int len);
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- Names --------------------------- */
|
|
|
|
/* output a PDF name (including leading slash) and quote all required chars */
|
|
|
|
void pdc_put_pdfname(pdc_output *out, const char *text, size_t len);
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- Arrays --------------------------- */
|
|
|
|
#define pdc_begin_array(out) pdc_puts(out, "[")
|
|
|
|
#define pdc_end_array(out) pdc_puts(out, "]\n")
|
|
|
|
#define pdc_end_array_c(out) pdc_puts(out, "]")
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- Dictionaries --------------------------- */
|
|
|
|
#define pdc_begin_dict(out) pdc_puts(out, "<<")
|
|
|
|
#define pdc_end_dict(out) pdc_puts(out, ">>\n")
|
|
|
|
#define pdc_end_dict_c(out) pdc_puts(out, ">>")
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- Object References --------------------------- */
|
|
|
|
#define pdc_objref(out, name, obj_id) \
|
|
|
|
pdc_printf(out, "%s %ld 0 R\n", name, obj_id)
|
|
|
|
|
|
|
|
#define pdc_objref_c(out, obj_id) \
|
|
|
|
pdc_printf(out, " %ld 0 R", obj_id)
|
|
|
|
|
2008-10-20 14:35:00 +00:00
|
|
|
#define pdc_objref_c2(out, obj_id, gen_no) \
|
|
|
|
pdc_printf(out, " %ld %d R", obj_id, gen_no)
|
|
|
|
|
2006-05-04 16:36:51 +00:00
|
|
|
/* --------------------------- Streams --------------------------- */
|
|
|
|
void pdc_begin_pdfstream(pdc_output *out);
|
|
|
|
void pdc_end_pdfstream(pdc_output *out);
|
|
|
|
pdc_off_t pdc_get_pdfstreamlength(pdc_output *out);
|
|
|
|
void pdc_put_pdfstreamlength(pdc_output *out, pdc_id length_id);
|
|
|
|
|
|
|
|
int pdc_get_compresslevel(pdc_output *out);
|
|
|
|
void pdc_set_compresslevel(pdc_output *out, int compresslevel);
|
|
|
|
|
|
|
|
|
2008-10-20 14:35:00 +00:00
|
|
|
|
2006-05-04 16:36:51 +00:00
|
|
|
/* --------------------------- Document sections --------------------------- */
|
|
|
|
void pdc_write_xref(pdc_output *out);
|
|
|
|
|
|
|
|
void pdc_write_digest(pdc_output *out);
|
|
|
|
void pdc_write_trailer(pdc_output *out, pdc_id info_id,
|
|
|
|
pdc_id root_id, int root_gen, long xref_size,
|
|
|
|
pdc_off_t xref_prev, pdc_off_t xref_pos);
|
|
|
|
void pdc_write_eof(pdc_output *out);
|
|
|
|
|
|
|
|
|
|
|
|
/* --------------------------- Low-level output --------------------------- */
|
|
|
|
void pdc_flush_stream(pdc_output *out);
|
|
|
|
pdc_off_t pdc_tell_out(pdc_output *out);
|
|
|
|
void pdc_close_output(pdc_output *out);
|
|
|
|
/* TODO2GB: size_t? */
|
|
|
|
char * pdc_get_stream_contents(pdc_output *out, pdc_off_t *size);
|
|
|
|
int pdc_stream_not_empty(pdc_output *out);
|
|
|
|
|
|
|
|
void pdc_write(pdc_output *out, const void *data, size_t size);
|
|
|
|
void pdc_puts(pdc_output *out, const char *s);
|
|
|
|
void pdc_putc(pdc_output *out, const char c);
|
|
|
|
|
|
|
|
|
|
|
|
/* ------------------------- High-level output ------------------------- */
|
|
|
|
void pdc_printf(pdc_output *out, const char *fmt, ...);
|
|
|
|
|
|
|
|
#endif /* PC_OUTPUT_H */
|
|
|
|
|