hpdf 2.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History +57 -0
- data/License +25 -0
- data/README +165 -0
- data/examples/arc_demo.rb +82 -0
- data/examples/demo.rb +92 -0
- data/examples/encryption.rb +41 -0
- data/examples/ext_gstater_demo.rb +171 -0
- data/examples/font_demo.rb +67 -0
- data/examples/jpfont_demo.rb +122 -0
- data/examples/line_demo.rb +301 -0
- data/examples/slide_show_demo.rb +139 -0
- data/examples/text_demo2.rb +189 -0
- data/examples/ttfont_demo.rb +106 -0
- data/ext/extconf.rb +6 -0
- data/ext/hpdf.c +3779 -0
- data/ext/hpdf_annotation.c +415 -0
- data/ext/hpdf_array.c +344 -0
- data/ext/hpdf_binary.c +117 -0
- data/ext/hpdf_boolean.c +47 -0
- data/ext/hpdf_catalog.c +354 -0
- data/ext/hpdf_destination.c +339 -0
- data/ext/hpdf_dict.c +488 -0
- data/ext/hpdf_doc.c +2020 -0
- data/ext/hpdf_doc_png.c +137 -0
- data/ext/hpdf_encoder.c +2991 -0
- data/ext/hpdf_encoder_cns.c +36359 -0
- data/ext/hpdf_encoder_cnt.c +15307 -0
- data/ext/hpdf_encoder_jp.c +16125 -0
- data/ext/hpdf_encoder_kr.c +27978 -0
- data/ext/hpdf_encrypt.c +632 -0
- data/ext/hpdf_encryptdict.c +240 -0
- data/ext/hpdf_error.c +114 -0
- data/ext/hpdf_ext_gstate.c +150 -0
- data/ext/hpdf_font.c +229 -0
- data/ext/hpdf_font_cid.c +1030 -0
- data/ext/hpdf_font_tt.c +406 -0
- data/ext/hpdf_font_type1.c +391 -0
- data/ext/hpdf_fontdef.c +56 -0
- data/ext/hpdf_fontdef_base14.c +4506 -0
- data/ext/hpdf_fontdef_cid.c +194 -0
- data/ext/hpdf_fontdef_cns.c +471 -0
- data/ext/hpdf_fontdef_cnt.c +250 -0
- data/ext/hpdf_fontdef_jp.c +1904 -0
- data/ext/hpdf_fontdef_kr.c +1572 -0
- data/ext/hpdf_fontdef_tt.c +2230 -0
- data/ext/hpdf_fontdef_type1.c +524 -0
- data/ext/hpdf_gstate.c +119 -0
- data/ext/hpdf_image.c +568 -0
- data/ext/hpdf_image_png.c +424 -0
- data/ext/hpdf_info.c +164 -0
- data/ext/hpdf_list.c +333 -0
- data/ext/hpdf_mmgr.c +243 -0
- data/ext/hpdf_name.c +71 -0
- data/ext/hpdf_null.c +31 -0
- data/ext/hpdf_number.c +49 -0
- data/ext/hpdf_objects.c +172 -0
- data/ext/hpdf_outline.c +329 -0
- data/ext/hpdf_page_label.c +74 -0
- data/ext/hpdf_page_operator.c +2764 -0
- data/ext/hpdf_pages.c +1508 -0
- data/ext/hpdf_real.c +61 -0
- data/ext/hpdf_streams.c +1435 -0
- data/ext/hpdf_string.c +189 -0
- data/ext/hpdf_utils.c +438 -0
- data/ext/hpdf_xref.c +348 -0
- data/ext/include/hpdf.h +1227 -0
- data/ext/include/hpdf_annotation.h +74 -0
- data/ext/include/hpdf_catalog.h +81 -0
- data/ext/include/hpdf_conf.h +76 -0
- data/ext/include/hpdf_consts.h +549 -0
- data/ext/include/hpdf_destination.h +41 -0
- data/ext/include/hpdf_doc.h +159 -0
- data/ext/include/hpdf_encoder.h +311 -0
- data/ext/include/hpdf_encrypt.h +156 -0
- data/ext/include/hpdf_encryptdict.h +66 -0
- data/ext/include/hpdf_error.h +201 -0
- data/ext/include/hpdf_ext_gstate.h +38 -0
- data/ext/include/hpdf_font.h +112 -0
- data/ext/include/hpdf_fontdef.h +403 -0
- data/ext/include/hpdf_gstate.h +80 -0
- data/ext/include/hpdf_image.h +72 -0
- data/ext/include/hpdf_info.h +48 -0
- data/ext/include/hpdf_list.h +85 -0
- data/ext/include/hpdf_mmgr.h +82 -0
- data/ext/include/hpdf_objects.h +587 -0
- data/ext/include/hpdf_outline.h +74 -0
- data/ext/include/hpdf_page_label.h +35 -0
- data/ext/include/hpdf_pages.h +128 -0
- data/ext/include/hpdf_streams.h +276 -0
- data/ext/include/hpdf_types.h +488 -0
- data/ext/include/hpdf_utils.h +161 -0
- data/tests/arc_demo.rb +82 -0
- data/tests/demo.rb +91 -0
- data/tests/encryption.rb +41 -0
- data/tests/ext_gstater_demo.rb +171 -0
- data/tests/font_demo.rb +67 -0
- data/tests/line_demo.rb +301 -0
- data/tests/slide_show_demo.rb +139 -0
- data/tests/test_all_examples.rb +31 -0
- data/tests/text_demo2.rb +189 -0
- metadata +147 -0
data/ext/hpdf_doc.c
ADDED
@@ -0,0 +1,2020 @@
|
|
1
|
+
/*
|
2
|
+
* << Haru Free PDF Library 2.0.5 >> -- hpdf_doc.c
|
3
|
+
*
|
4
|
+
* Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
|
5
|
+
*
|
6
|
+
* Permission to use, copy, modify, distribute and sell this software
|
7
|
+
* and its documentation for any purpose is hereby granted without fee,
|
8
|
+
* provided that the above copyright notice appear in all copies and
|
9
|
+
* that both that copyright notice and this permission notice appear
|
10
|
+
* in supporting documentation.
|
11
|
+
* It is provided "as is" without express or implied warranty.
|
12
|
+
*
|
13
|
+
*/
|
14
|
+
|
15
|
+
|
16
|
+
#include "hpdf_conf.h"
|
17
|
+
#include "hpdf_utils.h"
|
18
|
+
#include "hpdf_encryptdict.h"
|
19
|
+
#include "hpdf_destination.h"
|
20
|
+
#include "hpdf_info.h"
|
21
|
+
#include "hpdf_page_label.h"
|
22
|
+
#include "hpdf.h"
|
23
|
+
|
24
|
+
|
25
|
+
static const char *HPDF_VERSION_STR[5] = {
|
26
|
+
"%PDF-1.2\012%\267\276\255\252\012",
|
27
|
+
"%PDF-1.3\012%\267\276\255\252\012",
|
28
|
+
"%PDF-1.4\012%\267\276\255\252\012",
|
29
|
+
"%PDF-1.5\012%\267\276\255\252\012",
|
30
|
+
"%PDF-1.6\012%\267\276\255\252\012"
|
31
|
+
};
|
32
|
+
|
33
|
+
|
34
|
+
static HPDF_STATUS
|
35
|
+
WriteHeader (HPDF_Doc pdf,
|
36
|
+
HPDF_Stream stream);
|
37
|
+
|
38
|
+
|
39
|
+
static HPDF_STATUS
|
40
|
+
PrepareTrailer (HPDF_Doc pdf);
|
41
|
+
|
42
|
+
|
43
|
+
static void
|
44
|
+
FreeEncoderList (HPDF_Doc pdf);
|
45
|
+
|
46
|
+
|
47
|
+
static void
|
48
|
+
FreeFontDefList (HPDF_Doc pdf);
|
49
|
+
|
50
|
+
|
51
|
+
static void
|
52
|
+
CleanupFontDefList (HPDF_Doc pdf);
|
53
|
+
|
54
|
+
|
55
|
+
static HPDF_Dict
|
56
|
+
GetInfo (HPDF_Doc pdf);
|
57
|
+
|
58
|
+
static HPDF_STATUS
|
59
|
+
InternalSaveToStream (HPDF_Doc pdf,
|
60
|
+
HPDF_Stream stream);
|
61
|
+
|
62
|
+
static const char*
|
63
|
+
LoadType1FontFromStream (HPDF_Doc pdf,
|
64
|
+
HPDF_Stream afmdata,
|
65
|
+
HPDF_Stream pfmdata);
|
66
|
+
|
67
|
+
|
68
|
+
static const char*
|
69
|
+
LoadTTFontFromStream (HPDF_Doc pdf,
|
70
|
+
HPDF_Stream font_data,
|
71
|
+
HPDF_BOOL embedding,
|
72
|
+
const char *file_name);
|
73
|
+
|
74
|
+
|
75
|
+
static const char*
|
76
|
+
LoadTTFontFromStream2 (HPDF_Doc pdf,
|
77
|
+
HPDF_Stream font_data,
|
78
|
+
HPDF_UINT index,
|
79
|
+
HPDF_BOOL embedding,
|
80
|
+
const char *file_name);
|
81
|
+
|
82
|
+
|
83
|
+
/*---------------------------------------------------------------------------*/
|
84
|
+
|
85
|
+
HPDF_EXPORT(const char *)
|
86
|
+
HPDF_GetVersion (void)
|
87
|
+
{
|
88
|
+
return HPDF_VERSION_TEXT;
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
HPDF_BOOL
|
93
|
+
HPDF_Doc_Validate (HPDF_Doc pdf)
|
94
|
+
{
|
95
|
+
HPDF_PTRACE ((" HPDF_Doc_Validate\n"));
|
96
|
+
|
97
|
+
if (!pdf || pdf->sig_bytes != HPDF_SIG_BYTES)
|
98
|
+
return HPDF_FALSE;
|
99
|
+
else
|
100
|
+
return HPDF_TRUE;
|
101
|
+
}
|
102
|
+
|
103
|
+
|
104
|
+
HPDF_EXPORT(HPDF_BOOL)
|
105
|
+
HPDF_HasDoc (HPDF_Doc pdf)
|
106
|
+
{
|
107
|
+
HPDF_PTRACE ((" HPDF_HasDoc\n"));
|
108
|
+
|
109
|
+
if (!pdf || pdf->sig_bytes != HPDF_SIG_BYTES)
|
110
|
+
return HPDF_FALSE;
|
111
|
+
|
112
|
+
if (!pdf->catalog || pdf->error.error_no != HPDF_NOERROR) {
|
113
|
+
HPDF_RaiseError (&pdf->error, HPDF_INVALID_DOCUMENT, 0);
|
114
|
+
return HPDF_FALSE;
|
115
|
+
} else
|
116
|
+
return HPDF_TRUE;
|
117
|
+
}
|
118
|
+
|
119
|
+
|
120
|
+
HPDF_EXPORT(HPDF_Doc)
|
121
|
+
HPDF_New (HPDF_Error_Handler user_error_fn,
|
122
|
+
void *user_data)
|
123
|
+
{
|
124
|
+
HPDF_PTRACE ((" HPDF_New\n"));
|
125
|
+
|
126
|
+
return HPDF_NewEx (user_error_fn, NULL, NULL, 0, user_data);
|
127
|
+
}
|
128
|
+
|
129
|
+
|
130
|
+
HPDF_EXPORT(HPDF_Doc)
|
131
|
+
HPDF_NewEx (HPDF_Error_Handler user_error_fn,
|
132
|
+
HPDF_Alloc_Func user_alloc_fn,
|
133
|
+
HPDF_Free_Func user_free_fn,
|
134
|
+
HPDF_UINT mem_pool_buf_size,
|
135
|
+
void *user_data)
|
136
|
+
{
|
137
|
+
HPDF_Doc pdf;
|
138
|
+
HPDF_MMgr mmgr;
|
139
|
+
HPDF_Error_Rec tmp_error;
|
140
|
+
|
141
|
+
HPDF_PTRACE ((" HPDF_NewEx\n"));
|
142
|
+
|
143
|
+
/* initialize temporary-error object */
|
144
|
+
HPDF_Error_Init (&tmp_error, user_data);
|
145
|
+
|
146
|
+
/* create memory-manager object */
|
147
|
+
mmgr = HPDF_MMgr_New (&tmp_error, mem_pool_buf_size, user_alloc_fn,
|
148
|
+
user_free_fn);
|
149
|
+
if (!mmgr) {
|
150
|
+
HPDF_CheckError (&tmp_error);
|
151
|
+
return NULL;
|
152
|
+
}
|
153
|
+
|
154
|
+
/* now create pdf_doc object */
|
155
|
+
pdf = HPDF_GetMem (mmgr, sizeof (HPDF_Doc_Rec));
|
156
|
+
if (!pdf) {
|
157
|
+
HPDF_MMgr_Free (mmgr);
|
158
|
+
HPDF_CheckError (&tmp_error);
|
159
|
+
return NULL;
|
160
|
+
}
|
161
|
+
|
162
|
+
HPDF_MemSet (pdf, 0, sizeof (HPDF_Doc_Rec));
|
163
|
+
pdf->sig_bytes = HPDF_SIG_BYTES;
|
164
|
+
pdf->mmgr = mmgr;
|
165
|
+
pdf->pdf_version = HPDF_VER_13;
|
166
|
+
pdf->compression_mode = HPDF_COMP_NONE;
|
167
|
+
|
168
|
+
/* copy the data of temporary-error object to the one which is
|
169
|
+
included in pdf_doc object */
|
170
|
+
pdf->error = tmp_error;
|
171
|
+
|
172
|
+
/* switch the error-object of memory-manager */
|
173
|
+
mmgr->error = &pdf->error;
|
174
|
+
|
175
|
+
if (HPDF_NewDoc (pdf) != HPDF_OK) {
|
176
|
+
HPDF_Free (pdf);
|
177
|
+
HPDF_CheckError (&tmp_error);
|
178
|
+
return NULL;
|
179
|
+
}
|
180
|
+
|
181
|
+
pdf->error.error_fn = user_error_fn;
|
182
|
+
|
183
|
+
return pdf;
|
184
|
+
}
|
185
|
+
|
186
|
+
|
187
|
+
HPDF_EXPORT(void)
|
188
|
+
HPDF_Free (HPDF_Doc pdf)
|
189
|
+
{
|
190
|
+
HPDF_PTRACE ((" HPDF_Free\n"));
|
191
|
+
|
192
|
+
if (pdf) {
|
193
|
+
HPDF_MMgr mmgr = pdf->mmgr;
|
194
|
+
|
195
|
+
HPDF_FreeDocAll (pdf);
|
196
|
+
|
197
|
+
pdf->sig_bytes = 0;
|
198
|
+
|
199
|
+
HPDF_FreeMem (mmgr, pdf);
|
200
|
+
HPDF_MMgr_Free (mmgr);
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
|
205
|
+
HPDF_EXPORT(HPDF_STATUS)
|
206
|
+
HPDF_NewDoc (HPDF_Doc pdf)
|
207
|
+
{
|
208
|
+
char buf[HPDF_TMP_BUF_SIZ];
|
209
|
+
char *ptr = buf;
|
210
|
+
char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
|
211
|
+
const char *version;
|
212
|
+
|
213
|
+
HPDF_PTRACE ((" HPDF_NewDoc\n"));
|
214
|
+
|
215
|
+
if (!HPDF_Doc_Validate (pdf))
|
216
|
+
return HPDF_DOC_INVALID_OBJECT;
|
217
|
+
|
218
|
+
HPDF_FreeDoc (pdf);
|
219
|
+
|
220
|
+
pdf->xref = HPDF_Xref_New (pdf->mmgr, 0);
|
221
|
+
if (!pdf->xref)
|
222
|
+
return HPDF_CheckError (&pdf->error);
|
223
|
+
|
224
|
+
pdf->trailer = pdf->xref->trailer;
|
225
|
+
|
226
|
+
pdf->font_mgr = HPDF_List_New (pdf->mmgr, HPDF_DEF_ITEMS_PER_BLOCK);
|
227
|
+
if (!pdf->font_mgr)
|
228
|
+
return HPDF_CheckError (&pdf->error);
|
229
|
+
|
230
|
+
if (!pdf->fontdef_list) {
|
231
|
+
pdf->fontdef_list = HPDF_List_New (pdf->mmgr,
|
232
|
+
HPDF_DEF_ITEMS_PER_BLOCK);
|
233
|
+
if (!pdf->fontdef_list)
|
234
|
+
return HPDF_CheckError (&pdf->error);
|
235
|
+
}
|
236
|
+
|
237
|
+
if (!pdf->encoder_list) {
|
238
|
+
pdf->encoder_list = HPDF_List_New (pdf->mmgr,
|
239
|
+
HPDF_DEF_ITEMS_PER_BLOCK);
|
240
|
+
if (!pdf->encoder_list)
|
241
|
+
return HPDF_CheckError (&pdf->error);
|
242
|
+
}
|
243
|
+
|
244
|
+
pdf->catalog = HPDF_Catalog_New (pdf->mmgr, pdf->xref);
|
245
|
+
if (!pdf->catalog)
|
246
|
+
return HPDF_CheckError (&pdf->error);
|
247
|
+
|
248
|
+
pdf->root_pages = HPDF_Catalog_GetRoot (pdf->catalog);
|
249
|
+
if (!pdf->root_pages)
|
250
|
+
return HPDF_CheckError (&pdf->error);
|
251
|
+
|
252
|
+
pdf->page_list = HPDF_List_New (pdf->mmgr, HPDF_DEF_PAGE_LIST_NUM);
|
253
|
+
if (!pdf->page_list)
|
254
|
+
return HPDF_CheckError (&pdf->error);
|
255
|
+
|
256
|
+
pdf->cur_pages = pdf->root_pages;
|
257
|
+
|
258
|
+
ptr = HPDF_StrCpy (ptr, "Haru Free PDF Library ", eptr);
|
259
|
+
version = HPDF_GetVersion ();
|
260
|
+
HPDF_StrCpy (ptr, version, eptr);
|
261
|
+
|
262
|
+
if (HPDF_SetInfoAttr (pdf, HPDF_INFO_PRODUCER, buf) != HPDF_OK)
|
263
|
+
return HPDF_CheckError (&pdf->error);
|
264
|
+
|
265
|
+
return HPDF_OK;
|
266
|
+
}
|
267
|
+
|
268
|
+
|
269
|
+
HPDF_EXPORT(void)
|
270
|
+
HPDF_FreeDoc (HPDF_Doc pdf)
|
271
|
+
{
|
272
|
+
HPDF_PTRACE ((" HPDF_FreeDoc\n"));
|
273
|
+
|
274
|
+
if (HPDF_Doc_Validate (pdf)) {
|
275
|
+
if (pdf->xref) {
|
276
|
+
HPDF_Xref_Free (pdf->xref);
|
277
|
+
pdf->xref = NULL;
|
278
|
+
}
|
279
|
+
|
280
|
+
if (pdf->font_mgr) {
|
281
|
+
HPDF_List_Free (pdf->font_mgr);
|
282
|
+
pdf->font_mgr = NULL;
|
283
|
+
}
|
284
|
+
|
285
|
+
if (pdf->fontdef_list)
|
286
|
+
CleanupFontDefList (pdf);
|
287
|
+
|
288
|
+
HPDF_MemSet(pdf->ttfont_tag, 0, 6);
|
289
|
+
|
290
|
+
pdf->pdf_version = HPDF_VER_13;
|
291
|
+
pdf->outlines = NULL;
|
292
|
+
pdf->catalog = NULL;
|
293
|
+
pdf->root_pages = NULL;
|
294
|
+
pdf->cur_pages = NULL;
|
295
|
+
pdf->cur_page = NULL;
|
296
|
+
pdf->encrypt_on = HPDF_FALSE;
|
297
|
+
pdf->cur_page_num = 0;
|
298
|
+
pdf->cur_encoder = NULL;
|
299
|
+
pdf->def_encoder = NULL;
|
300
|
+
pdf->page_per_pages = 0;
|
301
|
+
|
302
|
+
if (pdf->page_list) {
|
303
|
+
HPDF_List_Free (pdf->page_list);
|
304
|
+
pdf->page_list = NULL;
|
305
|
+
}
|
306
|
+
|
307
|
+
pdf->encrypt_dict = NULL;
|
308
|
+
pdf->info = NULL;
|
309
|
+
|
310
|
+
HPDF_Error_Reset (&pdf->error);
|
311
|
+
|
312
|
+
if (pdf->stream) {
|
313
|
+
HPDF_Stream_Free (pdf->stream);
|
314
|
+
pdf->stream = NULL;
|
315
|
+
}
|
316
|
+
}
|
317
|
+
}
|
318
|
+
|
319
|
+
|
320
|
+
HPDF_EXPORT(void)
|
321
|
+
HPDF_FreeDocAll (HPDF_Doc pdf)
|
322
|
+
{
|
323
|
+
HPDF_PTRACE ((" HPDF_FreeDocAll\n"));
|
324
|
+
|
325
|
+
if (HPDF_Doc_Validate (pdf)) {
|
326
|
+
HPDF_FreeDoc (pdf);
|
327
|
+
|
328
|
+
if (pdf->fontdef_list)
|
329
|
+
FreeFontDefList (pdf);
|
330
|
+
|
331
|
+
if (pdf->encoder_list)
|
332
|
+
FreeEncoderList (pdf);
|
333
|
+
|
334
|
+
pdf->compression_mode = HPDF_COMP_NONE;
|
335
|
+
|
336
|
+
HPDF_Error_Reset (&pdf->error);
|
337
|
+
}
|
338
|
+
}
|
339
|
+
|
340
|
+
|
341
|
+
HPDF_EXPORT(HPDF_STATUS)
|
342
|
+
HPDF_SetPagesConfiguration (HPDF_Doc pdf,
|
343
|
+
HPDF_UINT page_per_pages)
|
344
|
+
{
|
345
|
+
HPDF_PTRACE ((" HPDF_SetPagesConfiguration\n"));
|
346
|
+
|
347
|
+
if (!HPDF_HasDoc (pdf))
|
348
|
+
return HPDF_INVALID_DOCUMENT;
|
349
|
+
|
350
|
+
if (pdf->cur_page)
|
351
|
+
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_DOCUMENT_STATE, 0);
|
352
|
+
|
353
|
+
if (page_per_pages > HPDF_LIMIT_MAX_ARRAY)
|
354
|
+
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_PARAMETER, 0);
|
355
|
+
|
356
|
+
if (pdf->cur_pages == pdf->root_pages) {
|
357
|
+
pdf->cur_pages = HPDF_Doc_AddPagesTo (pdf, pdf->root_pages);
|
358
|
+
if (!pdf->cur_pages)
|
359
|
+
return pdf->error.error_no;
|
360
|
+
pdf->cur_page_num = 0;
|
361
|
+
}
|
362
|
+
|
363
|
+
pdf->page_per_pages = page_per_pages;
|
364
|
+
|
365
|
+
return HPDF_OK;
|
366
|
+
}
|
367
|
+
|
368
|
+
|
369
|
+
static HPDF_STATUS
|
370
|
+
WriteHeader (HPDF_Doc pdf,
|
371
|
+
HPDF_Stream stream)
|
372
|
+
{
|
373
|
+
HPDF_UINT idx = (HPDF_INT)pdf->pdf_version;
|
374
|
+
|
375
|
+
HPDF_PTRACE ((" WriteHeader\n"));
|
376
|
+
|
377
|
+
if (HPDF_Stream_WriteStr (stream, HPDF_VERSION_STR[idx]) != HPDF_OK)
|
378
|
+
return pdf->error.error_no;
|
379
|
+
|
380
|
+
return HPDF_OK;
|
381
|
+
}
|
382
|
+
|
383
|
+
|
384
|
+
static HPDF_STATUS
|
385
|
+
PrepareTrailer (HPDF_Doc pdf)
|
386
|
+
{
|
387
|
+
HPDF_PTRACE ((" PrepareTrailer\n"));
|
388
|
+
|
389
|
+
if (HPDF_Dict_Add (pdf->trailer, "Root", pdf->catalog) != HPDF_OK)
|
390
|
+
return pdf->error.error_no;
|
391
|
+
|
392
|
+
if (HPDF_Dict_Add (pdf->trailer, "Info", pdf->info) != HPDF_OK)
|
393
|
+
return pdf->error.error_no;
|
394
|
+
|
395
|
+
return HPDF_OK;
|
396
|
+
}
|
397
|
+
|
398
|
+
|
399
|
+
HPDF_STATUS
|
400
|
+
HPDF_Doc_SetEncryptOn (HPDF_Doc pdf)
|
401
|
+
{
|
402
|
+
HPDF_PTRACE ((" HPDF_Doc_SetEncryptOn\n"));
|
403
|
+
|
404
|
+
if (pdf->encrypt_on)
|
405
|
+
return HPDF_OK;
|
406
|
+
|
407
|
+
if (!pdf->encrypt_dict)
|
408
|
+
return HPDF_SetError (&pdf->error, HPDF_DOC_ENCRYPTDICT_NOT_FOUND,
|
409
|
+
0);
|
410
|
+
|
411
|
+
if (pdf->encrypt_dict->header.obj_id == HPDF_OTYPE_NONE)
|
412
|
+
if (HPDF_Xref_Add (pdf->xref, pdf->encrypt_dict) != HPDF_OK)
|
413
|
+
return pdf->error.error_no;
|
414
|
+
|
415
|
+
if (HPDF_Dict_Add (pdf->trailer, "Encrypt", pdf->encrypt_dict) != HPDF_OK)
|
416
|
+
return pdf->error.error_no;
|
417
|
+
|
418
|
+
pdf->encrypt_on = HPDF_TRUE;
|
419
|
+
|
420
|
+
return HPDF_OK;
|
421
|
+
}
|
422
|
+
|
423
|
+
HPDF_EXPORT(HPDF_STATUS)
|
424
|
+
HPDF_SetPassword (HPDF_Doc pdf,
|
425
|
+
const char *owner_passwd,
|
426
|
+
const char *user_passwd)
|
427
|
+
{
|
428
|
+
HPDF_PTRACE ((" HPDF_SetPassword\n"));
|
429
|
+
|
430
|
+
if (!HPDF_HasDoc (pdf))
|
431
|
+
return HPDF_DOC_INVALID_OBJECT;
|
432
|
+
|
433
|
+
if (!pdf->encrypt_dict) {
|
434
|
+
pdf->encrypt_dict = HPDF_EncryptDict_New (pdf->mmgr, pdf->xref);
|
435
|
+
|
436
|
+
if (!pdf->encrypt_dict)
|
437
|
+
return HPDF_CheckError (&pdf->error);
|
438
|
+
}
|
439
|
+
|
440
|
+
if (HPDF_EncryptDict_SetPassword (pdf->encrypt_dict, owner_passwd,
|
441
|
+
user_passwd) != HPDF_OK)
|
442
|
+
return HPDF_CheckError (&pdf->error);
|
443
|
+
|
444
|
+
return HPDF_Doc_SetEncryptOn (pdf);
|
445
|
+
}
|
446
|
+
|
447
|
+
|
448
|
+
HPDF_EXPORT(HPDF_STATUS)
|
449
|
+
HPDF_SetPermission (HPDF_Doc pdf,
|
450
|
+
HPDF_UINT permission)
|
451
|
+
{
|
452
|
+
HPDF_Encrypt e;
|
453
|
+
|
454
|
+
HPDF_PTRACE ((" HPDF_SetPermission\n"));
|
455
|
+
|
456
|
+
if (!HPDF_HasDoc (pdf))
|
457
|
+
return HPDF_DOC_INVALID_OBJECT;
|
458
|
+
|
459
|
+
e = HPDF_EncryptDict_GetAttr (pdf->encrypt_dict);
|
460
|
+
|
461
|
+
if (!e)
|
462
|
+
return HPDF_RaiseError (&pdf->error,
|
463
|
+
HPDF_DOC_ENCRYPTDICT_NOT_FOUND, 0);
|
464
|
+
else
|
465
|
+
e->permission = permission;
|
466
|
+
|
467
|
+
return HPDF_OK;
|
468
|
+
}
|
469
|
+
|
470
|
+
|
471
|
+
HPDF_EXPORT(HPDF_STATUS)
|
472
|
+
HPDF_SetEncryptionMode (HPDF_Doc pdf,
|
473
|
+
HPDF_EncryptMode mode,
|
474
|
+
HPDF_UINT key_len)
|
475
|
+
{
|
476
|
+
HPDF_Encrypt e;
|
477
|
+
|
478
|
+
HPDF_PTRACE ((" HPDF_SetEncryptionMode\n"));
|
479
|
+
|
480
|
+
if (!HPDF_Doc_Validate (pdf))
|
481
|
+
return HPDF_DOC_INVALID_OBJECT;
|
482
|
+
|
483
|
+
e = HPDF_EncryptDict_GetAttr (pdf->encrypt_dict);
|
484
|
+
|
485
|
+
if (!e)
|
486
|
+
return HPDF_RaiseError (&pdf->error,
|
487
|
+
HPDF_DOC_ENCRYPTDICT_NOT_FOUND, 0);
|
488
|
+
else {
|
489
|
+
if (mode == HPDF_ENCRYPT_R2)
|
490
|
+
e->key_len = 5;
|
491
|
+
else {
|
492
|
+
/* if encryption mode is specified revision-3, the version of
|
493
|
+
* pdf file is set to 1.4
|
494
|
+
*/
|
495
|
+
pdf->pdf_version = HPDF_VER_14;
|
496
|
+
|
497
|
+
if (key_len >= 5 && key_len <= 16)
|
498
|
+
e->key_len = key_len;
|
499
|
+
else if (key_len == 0)
|
500
|
+
e->key_len = 16;
|
501
|
+
else
|
502
|
+
return HPDF_RaiseError (&pdf->error,
|
503
|
+
HPDF_INVALID_ENCRYPT_KEY_LEN, 0);
|
504
|
+
}
|
505
|
+
e->mode = mode;
|
506
|
+
}
|
507
|
+
|
508
|
+
return HPDF_OK;
|
509
|
+
}
|
510
|
+
|
511
|
+
|
512
|
+
HPDF_STATUS
|
513
|
+
HPDF_Doc_SetEncryptOff (HPDF_Doc pdf)
|
514
|
+
{
|
515
|
+
HPDF_PTRACE ((" HPDF_Doc_SetEncryptOff\n"));
|
516
|
+
|
517
|
+
if (!pdf->encrypt_on)
|
518
|
+
return HPDF_OK;
|
519
|
+
|
520
|
+
/* if encrypy-dict object is registered to cross-reference-table,
|
521
|
+
* replace it to null-object.
|
522
|
+
* additionally remove encrypt-dict object from trailer-object.
|
523
|
+
*/
|
524
|
+
if (pdf->encrypt_dict) {
|
525
|
+
HPDF_UINT obj_id = pdf->encrypt_dict->header.obj_id;
|
526
|
+
|
527
|
+
if (obj_id & HPDF_OTYPE_INDIRECT) {
|
528
|
+
HPDF_XrefEntry entry;
|
529
|
+
HPDF_Null null_obj;
|
530
|
+
|
531
|
+
HPDF_Dict_RemoveElement (pdf->trailer, "Encrypt");
|
532
|
+
|
533
|
+
entry = HPDF_Xref_GetEntryByObjectId (pdf->xref,
|
534
|
+
obj_id & 0x00FFFFFF);
|
535
|
+
|
536
|
+
if (!entry) {
|
537
|
+
return HPDF_SetError (&pdf->error,
|
538
|
+
HPDF_DOC_ENCRYPTDICT_NOT_FOUND, 0);
|
539
|
+
}
|
540
|
+
|
541
|
+
null_obj = HPDF_Null_New (pdf->mmgr);
|
542
|
+
if (!null_obj)
|
543
|
+
return pdf->error.error_no;
|
544
|
+
|
545
|
+
entry->obj = null_obj;
|
546
|
+
null_obj->header.obj_id = obj_id | HPDF_OTYPE_INDIRECT;
|
547
|
+
|
548
|
+
pdf->encrypt_dict->header.obj_id = HPDF_OTYPE_NONE;
|
549
|
+
}
|
550
|
+
}
|
551
|
+
|
552
|
+
pdf->encrypt_on = HPDF_FALSE;
|
553
|
+
return HPDF_OK;
|
554
|
+
}
|
555
|
+
|
556
|
+
|
557
|
+
HPDF_STATUS
|
558
|
+
HPDF_Doc_PrepareEncryption (HPDF_Doc pdf)
|
559
|
+
{
|
560
|
+
HPDF_Encrypt e= HPDF_EncryptDict_GetAttr (pdf->encrypt_dict);
|
561
|
+
HPDF_Dict info = GetInfo (pdf);
|
562
|
+
HPDF_Array id;
|
563
|
+
|
564
|
+
if (!e)
|
565
|
+
return HPDF_DOC_ENCRYPTDICT_NOT_FOUND;
|
566
|
+
|
567
|
+
if (!info)
|
568
|
+
return pdf->error.error_no;
|
569
|
+
|
570
|
+
if (HPDF_EncryptDict_Prepare (pdf->encrypt_dict, info, pdf->xref) !=
|
571
|
+
HPDF_OK)
|
572
|
+
return pdf->error.error_no;
|
573
|
+
|
574
|
+
/* reset 'ID' to trailer-dictionary */
|
575
|
+
id = HPDF_Dict_GetItem (pdf->trailer, "ID", HPDF_OCLASS_ARRAY);
|
576
|
+
if (!id) {
|
577
|
+
id = HPDF_Array_New (pdf->mmgr);
|
578
|
+
|
579
|
+
if (!id || HPDF_Dict_Add (pdf->trailer, "ID", id) != HPDF_OK)
|
580
|
+
return pdf->error.error_no;
|
581
|
+
} else
|
582
|
+
HPDF_Array_Clear (id);
|
583
|
+
|
584
|
+
if (HPDF_Array_Add (id, HPDF_Binary_New (pdf->mmgr, e->encrypt_id,
|
585
|
+
HPDF_ID_LEN)) != HPDF_OK)
|
586
|
+
return pdf->error.error_no;
|
587
|
+
|
588
|
+
if (HPDF_Array_Add (id, HPDF_Binary_New (pdf->mmgr, e->encrypt_id,
|
589
|
+
HPDF_ID_LEN)) != HPDF_OK)
|
590
|
+
return pdf->error.error_no;
|
591
|
+
|
592
|
+
return HPDF_OK;
|
593
|
+
}
|
594
|
+
|
595
|
+
|
596
|
+
static HPDF_STATUS
|
597
|
+
InternalSaveToStream (HPDF_Doc pdf,
|
598
|
+
HPDF_Stream stream)
|
599
|
+
{
|
600
|
+
HPDF_STATUS ret;
|
601
|
+
|
602
|
+
if ((ret = WriteHeader (pdf, stream)) != HPDF_OK)
|
603
|
+
return ret;
|
604
|
+
|
605
|
+
/* prepare trailer */
|
606
|
+
if ((ret = PrepareTrailer (pdf)) != HPDF_OK)
|
607
|
+
return ret;
|
608
|
+
|
609
|
+
/* prepare encription */
|
610
|
+
if (pdf->encrypt_on) {
|
611
|
+
HPDF_Encrypt e= HPDF_EncryptDict_GetAttr (pdf->encrypt_dict);
|
612
|
+
|
613
|
+
if ((ret = HPDF_Doc_PrepareEncryption (pdf)) != HPDF_OK)
|
614
|
+
return ret;
|
615
|
+
|
616
|
+
if ((ret = HPDF_Xref_WriteToStream (pdf->xref, stream, e)) != HPDF_OK)
|
617
|
+
return ret;
|
618
|
+
} else {
|
619
|
+
if ((ret = HPDF_Xref_WriteToStream (pdf->xref, stream, NULL)) !=
|
620
|
+
HPDF_OK)
|
621
|
+
return ret;
|
622
|
+
}
|
623
|
+
|
624
|
+
return HPDF_OK;
|
625
|
+
}
|
626
|
+
|
627
|
+
|
628
|
+
HPDF_EXPORT(HPDF_STATUS)
|
629
|
+
HPDF_SaveToStream (HPDF_Doc pdf)
|
630
|
+
{
|
631
|
+
HPDF_PTRACE ((" HPDF_SaveToStream\n"));
|
632
|
+
|
633
|
+
if (!HPDF_HasDoc (pdf))
|
634
|
+
return HPDF_INVALID_DOCUMENT;
|
635
|
+
|
636
|
+
if (!pdf->stream)
|
637
|
+
pdf->stream = HPDF_MemStream_New (pdf->mmgr, HPDF_STREAM_BUF_SIZ);
|
638
|
+
|
639
|
+
if (!HPDF_Stream_Validate (pdf->stream))
|
640
|
+
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_STREAM, 0);
|
641
|
+
|
642
|
+
HPDF_MemStream_FreeData (pdf->stream);
|
643
|
+
|
644
|
+
if (InternalSaveToStream (pdf, pdf->stream) != HPDF_OK)
|
645
|
+
return HPDF_CheckError (&pdf->error);
|
646
|
+
|
647
|
+
return HPDF_OK;
|
648
|
+
}
|
649
|
+
|
650
|
+
|
651
|
+
HPDF_EXPORT(HPDF_UINT32)
|
652
|
+
HPDF_GetStreamSize (HPDF_Doc pdf)
|
653
|
+
{
|
654
|
+
HPDF_PTRACE ((" HPDF_GetStreamSize\n"));
|
655
|
+
|
656
|
+
if (!HPDF_HasDoc (pdf))
|
657
|
+
return HPDF_INVALID_DOCUMENT;
|
658
|
+
|
659
|
+
if (!HPDF_Stream_Validate (pdf->stream))
|
660
|
+
return 0;
|
661
|
+
|
662
|
+
return HPDF_Stream_Size(pdf->stream);
|
663
|
+
}
|
664
|
+
|
665
|
+
|
666
|
+
HPDF_EXPORT(HPDF_STATUS)
|
667
|
+
HPDF_ReadFromStream (HPDF_Doc pdf,
|
668
|
+
HPDF_BYTE *buf,
|
669
|
+
HPDF_UINT32 *size)
|
670
|
+
{
|
671
|
+
HPDF_UINT isize = *size;
|
672
|
+
HPDF_STATUS ret;
|
673
|
+
|
674
|
+
if (!HPDF_HasDoc (pdf))
|
675
|
+
return HPDF_INVALID_DOCUMENT;
|
676
|
+
|
677
|
+
if (!HPDF_Stream_Validate (pdf->stream))
|
678
|
+
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_OPERATION, 0);
|
679
|
+
|
680
|
+
if (*size == 0)
|
681
|
+
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_PARAMETER, 0);
|
682
|
+
|
683
|
+
ret = HPDF_Stream_Read (pdf->stream, buf, &isize);
|
684
|
+
|
685
|
+
*size = isize;
|
686
|
+
|
687
|
+
if (ret != HPDF_OK)
|
688
|
+
HPDF_CheckError (&pdf->error);
|
689
|
+
|
690
|
+
return ret;
|
691
|
+
}
|
692
|
+
|
693
|
+
|
694
|
+
HPDF_EXPORT(HPDF_STATUS)
|
695
|
+
HPDF_ResetStream (HPDF_Doc pdf)
|
696
|
+
{
|
697
|
+
if (!HPDF_HasDoc (pdf))
|
698
|
+
return HPDF_INVALID_DOCUMENT;
|
699
|
+
|
700
|
+
if (!HPDF_Stream_Validate (pdf->stream))
|
701
|
+
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_OPERATION, 0);
|
702
|
+
|
703
|
+
return HPDF_Stream_Seek (pdf->stream, 0, HPDF_SEEK_SET);
|
704
|
+
}
|
705
|
+
|
706
|
+
|
707
|
+
HPDF_EXPORT(HPDF_STATUS)
|
708
|
+
HPDF_SaveToFile (HPDF_Doc pdf,
|
709
|
+
const char *file_name)
|
710
|
+
{
|
711
|
+
HPDF_Stream stream;
|
712
|
+
|
713
|
+
HPDF_PTRACE ((" HPDF_SaveToFile\n"));
|
714
|
+
|
715
|
+
if (!HPDF_HasDoc (pdf))
|
716
|
+
return HPDF_INVALID_DOCUMENT;
|
717
|
+
|
718
|
+
stream = HPDF_FileWriter_New (pdf->mmgr, file_name);
|
719
|
+
if (!stream)
|
720
|
+
return HPDF_CheckError (&pdf->error);
|
721
|
+
|
722
|
+
InternalSaveToStream (pdf, stream);
|
723
|
+
|
724
|
+
HPDF_Stream_Free (stream);
|
725
|
+
|
726
|
+
return HPDF_CheckError (&pdf->error);
|
727
|
+
}
|
728
|
+
|
729
|
+
|
730
|
+
HPDF_EXPORT(HPDF_Page)
|
731
|
+
HPDF_GetCurrentPage (HPDF_Doc pdf)
|
732
|
+
{
|
733
|
+
HPDF_PTRACE ((" HPDF_GetCurrentPage\n"));
|
734
|
+
|
735
|
+
if (!HPDF_HasDoc (pdf))
|
736
|
+
return NULL;
|
737
|
+
|
738
|
+
return pdf->cur_page;
|
739
|
+
}
|
740
|
+
|
741
|
+
|
742
|
+
HPDF_EXPORT(HPDF_Page)
|
743
|
+
HPDF_GetPageByIndex (HPDF_Doc pdf,
|
744
|
+
HPDF_UINT index)
|
745
|
+
{
|
746
|
+
HPDF_Page ret;
|
747
|
+
|
748
|
+
HPDF_PTRACE ((" HPDF_GetPageByIndex\n"));
|
749
|
+
|
750
|
+
if (!HPDF_HasDoc (pdf))
|
751
|
+
return NULL;
|
752
|
+
|
753
|
+
ret = HPDF_List_ItemAt (pdf->page_list, index);
|
754
|
+
if (!ret) {
|
755
|
+
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGE_INDEX, 0);
|
756
|
+
return NULL;
|
757
|
+
}
|
758
|
+
|
759
|
+
return ret;
|
760
|
+
}
|
761
|
+
|
762
|
+
|
763
|
+
HPDF_Pages
|
764
|
+
HPDF_Doc_GetCurrentPages (HPDF_Doc pdf)
|
765
|
+
{
|
766
|
+
HPDF_PTRACE ((" HPDF_GetCurrentPages\n"));
|
767
|
+
|
768
|
+
if (!HPDF_HasDoc (pdf))
|
769
|
+
return NULL;
|
770
|
+
|
771
|
+
return pdf->cur_pages;
|
772
|
+
}
|
773
|
+
|
774
|
+
|
775
|
+
HPDF_STATUS
|
776
|
+
HPDF_Doc_SetCurrentPages (HPDF_Doc pdf,
|
777
|
+
HPDF_Pages pages)
|
778
|
+
{
|
779
|
+
HPDF_PTRACE ((" HPDF_Doc_SetCurrentPages\n"));
|
780
|
+
|
781
|
+
if (!HPDF_HasDoc (pdf))
|
782
|
+
return HPDF_INVALID_DOCUMENT;
|
783
|
+
|
784
|
+
if (!HPDF_Pages_Validate (pages))
|
785
|
+
return HPDF_SetError (&pdf->error, HPDF_INVALID_PAGES, 0);
|
786
|
+
|
787
|
+
/* check whether the pages belong to the pdf */
|
788
|
+
if (pdf->mmgr != pages->mmgr)
|
789
|
+
return HPDF_SetError (&pdf->error, HPDF_INVALID_PAGES, 0);
|
790
|
+
|
791
|
+
pdf->cur_pages = pages;
|
792
|
+
|
793
|
+
return HPDF_OK;
|
794
|
+
}
|
795
|
+
|
796
|
+
|
797
|
+
HPDF_STATUS
|
798
|
+
HPDF_Doc_SetCurrentPage (HPDF_Doc pdf,
|
799
|
+
HPDF_Page page)
|
800
|
+
{
|
801
|
+
HPDF_PTRACE ((" HPDF_Doc_SetCurrentPage\n"));
|
802
|
+
|
803
|
+
if (!HPDF_HasDoc (pdf))
|
804
|
+
return HPDF_INVALID_DOCUMENT;
|
805
|
+
|
806
|
+
if (!HPDF_Page_Validate (page))
|
807
|
+
return HPDF_SetError (&pdf->error, HPDF_INVALID_PAGE, 0);
|
808
|
+
|
809
|
+
/* check whether the page belong to the pdf */
|
810
|
+
if (pdf->mmgr != page->mmgr)
|
811
|
+
return HPDF_SetError (&pdf->error, HPDF_INVALID_PAGE, 0);
|
812
|
+
|
813
|
+
pdf->cur_page = page;
|
814
|
+
|
815
|
+
return HPDF_OK;
|
816
|
+
}
|
817
|
+
|
818
|
+
|
819
|
+
HPDF_EXPORT(HPDF_Page)
|
820
|
+
HPDF_AddPage (HPDF_Doc pdf)
|
821
|
+
{
|
822
|
+
HPDF_Page page;
|
823
|
+
HPDF_STATUS ret;
|
824
|
+
|
825
|
+
HPDF_PTRACE ((" HPDF_AddPage\n"));
|
826
|
+
|
827
|
+
if (!HPDF_HasDoc (pdf))
|
828
|
+
return NULL;
|
829
|
+
|
830
|
+
if (pdf->page_per_pages) {
|
831
|
+
if (pdf->page_per_pages <= pdf->cur_page_num) {
|
832
|
+
pdf->cur_pages = HPDF_Doc_AddPagesTo (pdf, pdf->root_pages);
|
833
|
+
if (!pdf->cur_pages)
|
834
|
+
return NULL;
|
835
|
+
pdf->cur_page_num = 0;
|
836
|
+
}
|
837
|
+
}
|
838
|
+
|
839
|
+
page = HPDF_Page_New (pdf->mmgr, pdf->xref);
|
840
|
+
if (!page) {
|
841
|
+
HPDF_CheckError (&pdf->error);
|
842
|
+
return NULL;
|
843
|
+
}
|
844
|
+
|
845
|
+
if ((ret = HPDF_Pages_AddKids (pdf->cur_pages, page)) != HPDF_OK) {
|
846
|
+
HPDF_RaiseError (&pdf->error, ret, 0);
|
847
|
+
return NULL;
|
848
|
+
}
|
849
|
+
|
850
|
+
if ((ret = HPDF_List_Add (pdf->page_list, page)) != HPDF_OK) {
|
851
|
+
HPDF_RaiseError (&pdf->error, ret, 0);
|
852
|
+
return NULL;
|
853
|
+
}
|
854
|
+
|
855
|
+
pdf->cur_page = page;
|
856
|
+
|
857
|
+
if (pdf->compression_mode & HPDF_COMP_TEXT)
|
858
|
+
HPDF_Page_SetFilter (page, HPDF_STREAM_FILTER_FLATE_DECODE);
|
859
|
+
|
860
|
+
pdf->cur_page_num++;
|
861
|
+
|
862
|
+
return page;
|
863
|
+
}
|
864
|
+
|
865
|
+
|
866
|
+
HPDF_Pages
|
867
|
+
HPDF_Doc_AddPagesTo (HPDF_Doc pdf,
|
868
|
+
HPDF_Pages parent)
|
869
|
+
{
|
870
|
+
HPDF_Pages pages;
|
871
|
+
|
872
|
+
HPDF_PTRACE ((" HPDF_AddPagesTo\n"));
|
873
|
+
|
874
|
+
if (!HPDF_HasDoc (pdf))
|
875
|
+
return NULL;
|
876
|
+
|
877
|
+
if (!HPDF_Pages_Validate (parent)) {
|
878
|
+
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGES, 0);
|
879
|
+
return NULL;
|
880
|
+
}
|
881
|
+
|
882
|
+
/* check whether the page belong to the pdf */
|
883
|
+
if (pdf->mmgr != parent->mmgr) {
|
884
|
+
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGES, 0);
|
885
|
+
return NULL;
|
886
|
+
}
|
887
|
+
|
888
|
+
pages = HPDF_Pages_New (pdf->mmgr, parent, pdf->xref);
|
889
|
+
if (pages)
|
890
|
+
pdf->cur_pages = pages;
|
891
|
+
else
|
892
|
+
HPDF_CheckError (&pdf->error);
|
893
|
+
|
894
|
+
|
895
|
+
return pages;
|
896
|
+
}
|
897
|
+
|
898
|
+
|
899
|
+
HPDF_EXPORT(HPDF_Page)
|
900
|
+
HPDF_InsertPage (HPDF_Doc pdf,
|
901
|
+
HPDF_Page target)
|
902
|
+
{
|
903
|
+
HPDF_Page page;
|
904
|
+
HPDF_STATUS ret;
|
905
|
+
|
906
|
+
HPDF_PTRACE ((" HPDF_InsertPage\n"));
|
907
|
+
|
908
|
+
if (!HPDF_HasDoc (pdf))
|
909
|
+
return NULL;
|
910
|
+
|
911
|
+
if (!HPDF_Page_Validate (target)) {
|
912
|
+
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGE, 0);
|
913
|
+
return NULL;
|
914
|
+
}
|
915
|
+
|
916
|
+
/* check whether the page belong to the pdf */
|
917
|
+
if (pdf->mmgr != target->mmgr) {
|
918
|
+
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGE, 0);
|
919
|
+
return NULL;
|
920
|
+
}
|
921
|
+
|
922
|
+
page = HPDF_Page_New (pdf->mmgr, pdf->xref);
|
923
|
+
if (!page) {
|
924
|
+
HPDF_CheckError (&pdf->error);
|
925
|
+
return NULL;
|
926
|
+
}
|
927
|
+
|
928
|
+
if ((ret = HPDF_Page_InsertBefore (page, target)) != HPDF_OK) {
|
929
|
+
HPDF_RaiseError (&pdf->error, ret, 0);
|
930
|
+
return NULL;
|
931
|
+
}
|
932
|
+
|
933
|
+
if ((ret = HPDF_List_Insert (pdf->page_list, target, page)) != HPDF_OK) {
|
934
|
+
HPDF_RaiseError (&pdf->error, ret, 0);
|
935
|
+
return NULL;
|
936
|
+
}
|
937
|
+
|
938
|
+
if (pdf->compression_mode & HPDF_COMP_TEXT)
|
939
|
+
HPDF_Page_SetFilter (page, HPDF_STREAM_FILTER_FLATE_DECODE);
|
940
|
+
|
941
|
+
return page;
|
942
|
+
}
|
943
|
+
|
944
|
+
|
945
|
+
HPDF_EXPORT(HPDF_STATUS)
|
946
|
+
HPDF_SetErrorHandler (HPDF_Doc pdf,
|
947
|
+
HPDF_Error_Handler user_error_fn)
|
948
|
+
{
|
949
|
+
if (!HPDF_Doc_Validate (pdf))
|
950
|
+
return HPDF_INVALID_DOCUMENT;
|
951
|
+
|
952
|
+
pdf->error.error_fn = user_error_fn;
|
953
|
+
|
954
|
+
return HPDF_OK;
|
955
|
+
}
|
956
|
+
|
957
|
+
|
958
|
+
/*----- font handling -------------------------------------------------------*/
|
959
|
+
|
960
|
+
|
961
|
+
static void
|
962
|
+
FreeFontDefList (HPDF_Doc pdf)
|
963
|
+
{
|
964
|
+
HPDF_List list = pdf->fontdef_list;
|
965
|
+
HPDF_UINT i;
|
966
|
+
|
967
|
+
HPDF_PTRACE ((" HPDF_Doc_FreeFontDefList\n"));
|
968
|
+
|
969
|
+
for (i = 0; i < list->count; i++) {
|
970
|
+
HPDF_FontDef def = (HPDF_FontDef)HPDF_List_ItemAt (list, i);
|
971
|
+
|
972
|
+
HPDF_FontDef_Free (def);
|
973
|
+
}
|
974
|
+
|
975
|
+
HPDF_List_Free (list);
|
976
|
+
|
977
|
+
pdf->fontdef_list = NULL;
|
978
|
+
}
|
979
|
+
|
980
|
+
static void
|
981
|
+
CleanupFontDefList (HPDF_Doc pdf)
|
982
|
+
{
|
983
|
+
HPDF_List list = pdf->fontdef_list;
|
984
|
+
HPDF_UINT i;
|
985
|
+
|
986
|
+
HPDF_PTRACE ((" CleanupFontDefList\n"));
|
987
|
+
|
988
|
+
for (i = 0; i < list->count; i++) {
|
989
|
+
HPDF_FontDef def = (HPDF_FontDef)HPDF_List_ItemAt (list, i);
|
990
|
+
|
991
|
+
HPDF_FontDef_Cleanup (def);
|
992
|
+
}
|
993
|
+
}
|
994
|
+
|
995
|
+
|
996
|
+
HPDF_FontDef
|
997
|
+
HPDF_Doc_FindFontDef (HPDF_Doc pdf,
|
998
|
+
const char *font_name)
|
999
|
+
{
|
1000
|
+
HPDF_List list = pdf->fontdef_list;
|
1001
|
+
HPDF_UINT i;
|
1002
|
+
|
1003
|
+
HPDF_PTRACE ((" HPDF_Doc_FindFontDef\n"));
|
1004
|
+
|
1005
|
+
for (i = 0; i < list->count; i++) {
|
1006
|
+
HPDF_FontDef def = (HPDF_FontDef)HPDF_List_ItemAt (list, i);
|
1007
|
+
|
1008
|
+
if (HPDF_StrCmp (font_name, def->base_font) == 0) {
|
1009
|
+
if (def->type == HPDF_FONTDEF_TYPE_UNINITIALIZED) {
|
1010
|
+
if (!def->init_fn ||
|
1011
|
+
def->init_fn (def) != HPDF_OK)
|
1012
|
+
return NULL;
|
1013
|
+
}
|
1014
|
+
|
1015
|
+
return def;
|
1016
|
+
}
|
1017
|
+
}
|
1018
|
+
|
1019
|
+
return NULL;
|
1020
|
+
}
|
1021
|
+
|
1022
|
+
|
1023
|
+
HPDF_STATUS
|
1024
|
+
HPDF_Doc_RegisterFontDef (HPDF_Doc pdf,
|
1025
|
+
HPDF_FontDef fontdef)
|
1026
|
+
{
|
1027
|
+
HPDF_STATUS ret;
|
1028
|
+
|
1029
|
+
HPDF_PTRACE ((" HPDF_Doc_RegisterFontDef\n"));
|
1030
|
+
|
1031
|
+
if (!fontdef)
|
1032
|
+
return HPDF_SetError (&pdf->error, HPDF_INVALID_OBJECT, 0);
|
1033
|
+
|
1034
|
+
if (HPDF_Doc_FindFontDef (pdf, fontdef->base_font) != NULL) {
|
1035
|
+
HPDF_FontDef_Free (fontdef);
|
1036
|
+
return HPDF_SetError (&pdf->error, HPDF_DUPLICATE_REGISTRATION, 0);
|
1037
|
+
}
|
1038
|
+
|
1039
|
+
if ((ret = HPDF_List_Add (pdf->fontdef_list, fontdef)) != HPDF_OK) {
|
1040
|
+
HPDF_FontDef_Free (fontdef);
|
1041
|
+
return HPDF_SetError (&pdf->error, ret, 0);
|
1042
|
+
}
|
1043
|
+
|
1044
|
+
return HPDF_OK;
|
1045
|
+
}
|
1046
|
+
|
1047
|
+
|
1048
|
+
|
1049
|
+
HPDF_FontDef
|
1050
|
+
HPDF_GetFontDef (HPDF_Doc pdf,
|
1051
|
+
const char *font_name)
|
1052
|
+
{
|
1053
|
+
HPDF_STATUS ret;
|
1054
|
+
HPDF_FontDef def;
|
1055
|
+
|
1056
|
+
HPDF_PTRACE ((" HPDF_GetFontDef\n"));
|
1057
|
+
|
1058
|
+
if (!HPDF_HasDoc (pdf))
|
1059
|
+
return NULL;
|
1060
|
+
|
1061
|
+
def = HPDF_Doc_FindFontDef (pdf, font_name);
|
1062
|
+
|
1063
|
+
if (!def) {
|
1064
|
+
def = HPDF_Base14FontDef_New (pdf->mmgr, font_name);
|
1065
|
+
|
1066
|
+
if (!def)
|
1067
|
+
return NULL;
|
1068
|
+
|
1069
|
+
if ((ret = HPDF_List_Add (pdf->fontdef_list, def)) != HPDF_OK) {
|
1070
|
+
HPDF_FontDef_Free (def);
|
1071
|
+
HPDF_RaiseError (&pdf->error, ret, 0);
|
1072
|
+
def = NULL;
|
1073
|
+
}
|
1074
|
+
}
|
1075
|
+
|
1076
|
+
return def;
|
1077
|
+
}
|
1078
|
+
|
1079
|
+
|
1080
|
+
/*----- encoder handling ----------------------------------------------------*/
|
1081
|
+
|
1082
|
+
|
1083
|
+
HPDF_Encoder
|
1084
|
+
HPDF_Doc_FindEncoder (HPDF_Doc pdf,
|
1085
|
+
const char *encoding_name)
|
1086
|
+
{
|
1087
|
+
HPDF_List list = pdf->encoder_list;
|
1088
|
+
HPDF_UINT i;
|
1089
|
+
|
1090
|
+
HPDF_PTRACE ((" HPDF_Doc_FindEncoder\n"));
|
1091
|
+
|
1092
|
+
for (i = 0; i < list->count; i++) {
|
1093
|
+
HPDF_Encoder encoder = (HPDF_Encoder)HPDF_List_ItemAt (list, i);
|
1094
|
+
|
1095
|
+
if (HPDF_StrCmp (encoding_name, encoder->name) == 0) {
|
1096
|
+
|
1097
|
+
/* if encoder is uninitialize, call init_fn() */
|
1098
|
+
if (encoder->type == HPDF_ENCODER_TYPE_UNINITIALIZED) {
|
1099
|
+
if (!encoder->init_fn ||
|
1100
|
+
encoder->init_fn (encoder) != HPDF_OK)
|
1101
|
+
return NULL;
|
1102
|
+
}
|
1103
|
+
|
1104
|
+
return encoder;
|
1105
|
+
}
|
1106
|
+
}
|
1107
|
+
|
1108
|
+
return NULL;
|
1109
|
+
}
|
1110
|
+
|
1111
|
+
|
1112
|
+
|
1113
|
+
HPDF_STATUS
|
1114
|
+
HPDF_Doc_RegisterEncoder (HPDF_Doc pdf,
|
1115
|
+
HPDF_Encoder encoder)
|
1116
|
+
{
|
1117
|
+
HPDF_STATUS ret;
|
1118
|
+
|
1119
|
+
if (!encoder)
|
1120
|
+
return HPDF_SetError (&pdf->error, HPDF_INVALID_OBJECT, 0);
|
1121
|
+
|
1122
|
+
if (HPDF_Doc_FindEncoder (pdf, encoder->name) != NULL) {
|
1123
|
+
HPDF_Encoder_Free (encoder);
|
1124
|
+
return HPDF_SetError (&pdf->error, HPDF_DUPLICATE_REGISTRATION, 0);
|
1125
|
+
}
|
1126
|
+
|
1127
|
+
if ((ret = HPDF_List_Add (pdf->encoder_list, encoder)) != HPDF_OK) {
|
1128
|
+
HPDF_Encoder_Free (encoder);
|
1129
|
+
return HPDF_SetError (&pdf->error, ret, 0);
|
1130
|
+
}
|
1131
|
+
|
1132
|
+
return HPDF_OK;
|
1133
|
+
}
|
1134
|
+
|
1135
|
+
|
1136
|
+
HPDF_EXPORT(HPDF_Encoder)
|
1137
|
+
HPDF_GetEncoder (HPDF_Doc pdf,
|
1138
|
+
const char *encoding_name)
|
1139
|
+
{
|
1140
|
+
HPDF_Encoder encoder;
|
1141
|
+
HPDF_STATUS ret;
|
1142
|
+
|
1143
|
+
HPDF_PTRACE ((" HPDF_GetEncoder\n"));
|
1144
|
+
|
1145
|
+
if (!HPDF_HasDoc (pdf))
|
1146
|
+
return NULL;
|
1147
|
+
|
1148
|
+
encoder = HPDF_Doc_FindEncoder (pdf, encoding_name);
|
1149
|
+
|
1150
|
+
if (!encoder) {
|
1151
|
+
encoder = HPDF_BasicEncoder_New (pdf->mmgr, encoding_name);
|
1152
|
+
|
1153
|
+
if (!encoder) {
|
1154
|
+
HPDF_CheckError (&pdf->error);
|
1155
|
+
return NULL;
|
1156
|
+
}
|
1157
|
+
|
1158
|
+
if ((ret = HPDF_List_Add (pdf->encoder_list, encoder)) != HPDF_OK) {
|
1159
|
+
HPDF_Encoder_Free (encoder);
|
1160
|
+
HPDF_RaiseError (&pdf->error, ret, 0);
|
1161
|
+
return NULL;
|
1162
|
+
}
|
1163
|
+
}
|
1164
|
+
|
1165
|
+
return encoder;
|
1166
|
+
}
|
1167
|
+
|
1168
|
+
|
1169
|
+
HPDF_EXPORT(HPDF_Encoder)
|
1170
|
+
HPDF_GetCurrentEncoder (HPDF_Doc pdf)
|
1171
|
+
{
|
1172
|
+
if (!HPDF_HasDoc (pdf))
|
1173
|
+
return NULL;
|
1174
|
+
|
1175
|
+
return pdf->cur_encoder;
|
1176
|
+
}
|
1177
|
+
|
1178
|
+
|
1179
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1180
|
+
HPDF_SetCurrentEncoder (HPDF_Doc pdf,
|
1181
|
+
const char *encoding_name)
|
1182
|
+
{
|
1183
|
+
HPDF_Encoder encoder;
|
1184
|
+
|
1185
|
+
if (!HPDF_HasDoc (pdf))
|
1186
|
+
return HPDF_GetError (pdf);
|
1187
|
+
|
1188
|
+
encoder = HPDF_GetEncoder (pdf, encoding_name);
|
1189
|
+
pdf->cur_encoder = encoder;
|
1190
|
+
|
1191
|
+
if (!pdf)
|
1192
|
+
return HPDF_GetError (pdf);
|
1193
|
+
|
1194
|
+
return HPDF_OK;
|
1195
|
+
}
|
1196
|
+
|
1197
|
+
|
1198
|
+
static void
|
1199
|
+
FreeEncoderList (HPDF_Doc pdf)
|
1200
|
+
{
|
1201
|
+
HPDF_List list = pdf->encoder_list;
|
1202
|
+
HPDF_UINT i;
|
1203
|
+
|
1204
|
+
HPDF_PTRACE ((" FreeEncoderList\n"));
|
1205
|
+
|
1206
|
+
for (i = 0; i < list->count; i++) {
|
1207
|
+
HPDF_Encoder encoder = (HPDF_Encoder)HPDF_List_ItemAt (list, i);
|
1208
|
+
|
1209
|
+
HPDF_Encoder_Free (encoder);
|
1210
|
+
}
|
1211
|
+
|
1212
|
+
HPDF_List_Free (list);
|
1213
|
+
|
1214
|
+
pdf->encoder_list = NULL;
|
1215
|
+
}
|
1216
|
+
|
1217
|
+
|
1218
|
+
/*----- font handling -------------------------------------------------------*/
|
1219
|
+
|
1220
|
+
|
1221
|
+
HPDF_Font
|
1222
|
+
HPDF_Doc_FindFont (HPDF_Doc pdf,
|
1223
|
+
const char *font_name,
|
1224
|
+
const char *encoding_name)
|
1225
|
+
{
|
1226
|
+
HPDF_UINT i;
|
1227
|
+
HPDF_Font font;
|
1228
|
+
|
1229
|
+
HPDF_PTRACE ((" HPDF_Doc_FindFont\n"));
|
1230
|
+
|
1231
|
+
for (i = 0; i < pdf->font_mgr->count; i++) {
|
1232
|
+
HPDF_FontAttr attr;
|
1233
|
+
|
1234
|
+
font = (HPDF_Font)HPDF_List_ItemAt (pdf->font_mgr, i);
|
1235
|
+
attr = (HPDF_FontAttr) font->attr;
|
1236
|
+
|
1237
|
+
if (HPDF_StrCmp (attr->fontdef->base_font, font_name) == 0 &&
|
1238
|
+
HPDF_StrCmp (attr->encoder->name, encoding_name) == 0)
|
1239
|
+
return font;
|
1240
|
+
}
|
1241
|
+
|
1242
|
+
return NULL;
|
1243
|
+
}
|
1244
|
+
|
1245
|
+
|
1246
|
+
HPDF_EXPORT(HPDF_Font)
|
1247
|
+
HPDF_GetFont (HPDF_Doc pdf,
|
1248
|
+
const char *font_name,
|
1249
|
+
const char *encoding_name)
|
1250
|
+
{
|
1251
|
+
HPDF_FontDef fontdef = NULL;
|
1252
|
+
HPDF_Encoder encoder = NULL;
|
1253
|
+
HPDF_Font font;
|
1254
|
+
|
1255
|
+
HPDF_PTRACE ((" HPDF_GetFont\n"));
|
1256
|
+
|
1257
|
+
if (!HPDF_HasDoc (pdf))
|
1258
|
+
return NULL;
|
1259
|
+
|
1260
|
+
if (!font_name) {
|
1261
|
+
HPDF_RaiseError (&pdf->error, HPDF_INVALID_FONT_NAME, 0);
|
1262
|
+
return NULL;
|
1263
|
+
}
|
1264
|
+
|
1265
|
+
/* if encoding-name is not specified, find default-encoding of fontdef
|
1266
|
+
*/
|
1267
|
+
if (!encoding_name) {
|
1268
|
+
fontdef = HPDF_GetFontDef (pdf, font_name);
|
1269
|
+
|
1270
|
+
if (fontdef) {
|
1271
|
+
HPDF_Type1FontDefAttr attr = (HPDF_Type1FontDefAttr)fontdef->attr;
|
1272
|
+
|
1273
|
+
if (fontdef->type == HPDF_FONTDEF_TYPE_TYPE1 &&
|
1274
|
+
HPDF_StrCmp (attr->encoding_scheme,
|
1275
|
+
HPDF_ENCODING_FONT_SPECIFIC) == 0)
|
1276
|
+
encoder = HPDF_GetEncoder (pdf, HPDF_ENCODING_FONT_SPECIFIC);
|
1277
|
+
else
|
1278
|
+
encoder = HPDF_GetEncoder (pdf, HPDF_ENCODING_STANDARD);
|
1279
|
+
} else {
|
1280
|
+
HPDF_CheckError (&pdf->error);
|
1281
|
+
return NULL;
|
1282
|
+
}
|
1283
|
+
|
1284
|
+
font = HPDF_Doc_FindFont (pdf, font_name, encoder->name);
|
1285
|
+
} else {
|
1286
|
+
font = HPDF_Doc_FindFont (pdf, font_name, encoding_name);
|
1287
|
+
}
|
1288
|
+
|
1289
|
+
if (font)
|
1290
|
+
return font;
|
1291
|
+
|
1292
|
+
if (!fontdef) {
|
1293
|
+
fontdef = HPDF_GetFontDef (pdf, font_name);
|
1294
|
+
|
1295
|
+
if (!fontdef) {
|
1296
|
+
HPDF_CheckError (&pdf->error);
|
1297
|
+
return NULL;
|
1298
|
+
}
|
1299
|
+
}
|
1300
|
+
|
1301
|
+
if (!encoder) {
|
1302
|
+
encoder = HPDF_GetEncoder (pdf, encoding_name);
|
1303
|
+
|
1304
|
+
if (!encoder)
|
1305
|
+
return NULL;
|
1306
|
+
}
|
1307
|
+
|
1308
|
+
switch (fontdef->type) {
|
1309
|
+
case HPDF_FONTDEF_TYPE_TYPE1:
|
1310
|
+
font = HPDF_Type1Font_New (pdf->mmgr, fontdef, encoder, pdf->xref);
|
1311
|
+
|
1312
|
+
if (font)
|
1313
|
+
HPDF_List_Add (pdf->font_mgr, font);
|
1314
|
+
|
1315
|
+
break;
|
1316
|
+
case HPDF_FONTDEF_TYPE_TRUETYPE:
|
1317
|
+
if (encoder->type == HPDF_ENCODER_TYPE_DOUBLE_BYTE)
|
1318
|
+
font = HPDF_Type0Font_New (pdf->mmgr, fontdef, encoder,
|
1319
|
+
pdf->xref);
|
1320
|
+
else
|
1321
|
+
font = HPDF_TTFont_New (pdf->mmgr, fontdef, encoder, pdf->xref);
|
1322
|
+
|
1323
|
+
if (font)
|
1324
|
+
HPDF_List_Add (pdf->font_mgr, font);
|
1325
|
+
|
1326
|
+
break;
|
1327
|
+
case HPDF_FONTDEF_TYPE_CID:
|
1328
|
+
font = HPDF_Type0Font_New (pdf->mmgr, fontdef, encoder, pdf->xref);
|
1329
|
+
|
1330
|
+
if (font)
|
1331
|
+
HPDF_List_Add (pdf->font_mgr, font);
|
1332
|
+
|
1333
|
+
break;
|
1334
|
+
default:
|
1335
|
+
HPDF_RaiseError (&pdf->error, HPDF_UNSUPPORTED_FONT_TYPE, 0);
|
1336
|
+
return NULL;
|
1337
|
+
}
|
1338
|
+
|
1339
|
+
if (!font)
|
1340
|
+
HPDF_CheckError (&pdf->error);
|
1341
|
+
|
1342
|
+
if (font && (pdf->compression_mode & HPDF_COMP_METADATA))
|
1343
|
+
font->filter = HPDF_STREAM_FILTER_FLATE_DECODE;
|
1344
|
+
|
1345
|
+
return font;
|
1346
|
+
}
|
1347
|
+
|
1348
|
+
|
1349
|
+
HPDF_EXPORT(const char*)
|
1350
|
+
HPDF_LoadType1FontFromFile (HPDF_Doc pdf,
|
1351
|
+
const char *afm_file_name,
|
1352
|
+
const char *data_file_name)
|
1353
|
+
{
|
1354
|
+
HPDF_Stream afm;
|
1355
|
+
HPDF_Stream pfm = NULL;
|
1356
|
+
const char *ret;
|
1357
|
+
|
1358
|
+
HPDF_PTRACE ((" HPDF_LoadType1FontFromFile\n"));
|
1359
|
+
|
1360
|
+
if (!HPDF_HasDoc (pdf))
|
1361
|
+
return NULL;
|
1362
|
+
|
1363
|
+
/* create file stream */
|
1364
|
+
afm = HPDF_FileReader_New (pdf->mmgr, afm_file_name);
|
1365
|
+
|
1366
|
+
if (data_file_name)
|
1367
|
+
pfm = HPDF_FileReader_New (pdf->mmgr, data_file_name);
|
1368
|
+
|
1369
|
+
if (HPDF_Stream_Validate (afm) &&
|
1370
|
+
(!data_file_name || HPDF_Stream_Validate (pfm))) {
|
1371
|
+
|
1372
|
+
ret = LoadType1FontFromStream (pdf, afm, pfm);
|
1373
|
+
} else
|
1374
|
+
ret = NULL;
|
1375
|
+
|
1376
|
+
/* destroy file stream */
|
1377
|
+
if (afm)
|
1378
|
+
HPDF_Stream_Free (afm);
|
1379
|
+
|
1380
|
+
if (pfm)
|
1381
|
+
HPDF_Stream_Free (pfm);
|
1382
|
+
|
1383
|
+
if (!ret)
|
1384
|
+
HPDF_CheckError (&pdf->error);
|
1385
|
+
|
1386
|
+
return ret;
|
1387
|
+
}
|
1388
|
+
|
1389
|
+
|
1390
|
+
static const char*
|
1391
|
+
LoadType1FontFromStream (HPDF_Doc pdf,
|
1392
|
+
HPDF_Stream afmdata,
|
1393
|
+
HPDF_Stream pfmdata)
|
1394
|
+
{
|
1395
|
+
HPDF_FontDef def;
|
1396
|
+
|
1397
|
+
HPDF_PTRACE ((" HPDF_LoadType1FontFromStream\n"));
|
1398
|
+
|
1399
|
+
if (!HPDF_HasDoc (pdf))
|
1400
|
+
return NULL;
|
1401
|
+
|
1402
|
+
def = HPDF_Type1FontDef_Load (pdf->mmgr, afmdata, pfmdata);
|
1403
|
+
if (def) {
|
1404
|
+
HPDF_FontDef tmpdef = HPDF_Doc_FindFontDef (pdf, def->base_font);
|
1405
|
+
if (tmpdef) {
|
1406
|
+
HPDF_FontDef_Free (def);
|
1407
|
+
HPDF_SetError (&pdf->error, HPDF_FONT_EXISTS, 0);
|
1408
|
+
return NULL;
|
1409
|
+
}
|
1410
|
+
|
1411
|
+
if (HPDF_List_Add (pdf->fontdef_list, def) != HPDF_OK) {
|
1412
|
+
HPDF_FontDef_Free (def);
|
1413
|
+
return NULL;
|
1414
|
+
}
|
1415
|
+
}
|
1416
|
+
return def->base_font;
|
1417
|
+
}
|
1418
|
+
|
1419
|
+
|
1420
|
+
HPDF_EXPORT(const char*)
|
1421
|
+
HPDF_LoadTTFontFromFile (HPDF_Doc pdf,
|
1422
|
+
const char *file_name,
|
1423
|
+
HPDF_BOOL embedding)
|
1424
|
+
{
|
1425
|
+
HPDF_Stream font_data;
|
1426
|
+
const char *ret;
|
1427
|
+
|
1428
|
+
HPDF_PTRACE ((" HPDF_LoadTTFontFromFile\n"));
|
1429
|
+
|
1430
|
+
if (!HPDF_HasDoc (pdf))
|
1431
|
+
return NULL;
|
1432
|
+
|
1433
|
+
/* create file stream */
|
1434
|
+
font_data = HPDF_FileReader_New (pdf->mmgr, file_name);
|
1435
|
+
|
1436
|
+
if (HPDF_Stream_Validate (font_data)) {
|
1437
|
+
ret = LoadTTFontFromStream (pdf, font_data, embedding, file_name);
|
1438
|
+
} else
|
1439
|
+
ret = NULL;
|
1440
|
+
|
1441
|
+
if (!ret)
|
1442
|
+
HPDF_CheckError (&pdf->error);
|
1443
|
+
|
1444
|
+
return ret;
|
1445
|
+
}
|
1446
|
+
|
1447
|
+
|
1448
|
+
static const char*
|
1449
|
+
LoadTTFontFromStream (HPDF_Doc pdf,
|
1450
|
+
HPDF_Stream font_data,
|
1451
|
+
HPDF_BOOL embedding,
|
1452
|
+
const char *file_name)
|
1453
|
+
{
|
1454
|
+
HPDF_FontDef def;
|
1455
|
+
|
1456
|
+
HPDF_PTRACE ((" HPDF_LoadTTFontFromStream\n"));
|
1457
|
+
|
1458
|
+
def = HPDF_TTFontDef_Load (pdf->mmgr, font_data, embedding);
|
1459
|
+
if (def) {
|
1460
|
+
HPDF_FontDef tmpdef = HPDF_Doc_FindFontDef (pdf, def->base_font);
|
1461
|
+
if (tmpdef) {
|
1462
|
+
HPDF_FontDef_Free (def);
|
1463
|
+
HPDF_SetError (&pdf->error, HPDF_FONT_EXISTS, 0);
|
1464
|
+
return NULL;
|
1465
|
+
}
|
1466
|
+
|
1467
|
+
if (HPDF_List_Add (pdf->fontdef_list, def) != HPDF_OK) {
|
1468
|
+
HPDF_FontDef_Free (def);
|
1469
|
+
return NULL;
|
1470
|
+
}
|
1471
|
+
} else
|
1472
|
+
return NULL;
|
1473
|
+
|
1474
|
+
if (embedding) {
|
1475
|
+
if (pdf->ttfont_tag[0] == 0) {
|
1476
|
+
HPDF_MemCpy (pdf->ttfont_tag, "HPDFAA", 6);
|
1477
|
+
} else {
|
1478
|
+
HPDF_INT i;
|
1479
|
+
|
1480
|
+
for (i = 5; i >= 0; i--) {
|
1481
|
+
pdf->ttfont_tag[i] += 1;
|
1482
|
+
if (pdf->ttfont_tag[i] > 'Z')
|
1483
|
+
pdf->ttfont_tag[i] = 'A';
|
1484
|
+
else
|
1485
|
+
break;
|
1486
|
+
}
|
1487
|
+
}
|
1488
|
+
|
1489
|
+
HPDF_TTFontDef_SetTagName (def, pdf->ttfont_tag);
|
1490
|
+
}
|
1491
|
+
|
1492
|
+
return def->base_font;
|
1493
|
+
}
|
1494
|
+
|
1495
|
+
|
1496
|
+
HPDF_EXPORT(const char*)
|
1497
|
+
HPDF_LoadTTFontFromFile2 (HPDF_Doc pdf,
|
1498
|
+
const char *file_name,
|
1499
|
+
HPDF_UINT index,
|
1500
|
+
HPDF_BOOL embedding)
|
1501
|
+
{
|
1502
|
+
HPDF_Stream font_data;
|
1503
|
+
const char *ret;
|
1504
|
+
|
1505
|
+
HPDF_PTRACE ((" HPDF_LoadTTFontFromFile2\n"));
|
1506
|
+
|
1507
|
+
if (!HPDF_HasDoc (pdf))
|
1508
|
+
return NULL;
|
1509
|
+
|
1510
|
+
/* create file stream */
|
1511
|
+
font_data = HPDF_FileReader_New (pdf->mmgr, file_name);
|
1512
|
+
|
1513
|
+
if (HPDF_Stream_Validate (font_data)) {
|
1514
|
+
ret = LoadTTFontFromStream2 (pdf, font_data, index, embedding, file_name);
|
1515
|
+
} else
|
1516
|
+
ret = NULL;
|
1517
|
+
|
1518
|
+
if (!ret)
|
1519
|
+
HPDF_CheckError (&pdf->error);
|
1520
|
+
|
1521
|
+
return ret;
|
1522
|
+
}
|
1523
|
+
|
1524
|
+
|
1525
|
+
static const char*
|
1526
|
+
LoadTTFontFromStream2 (HPDF_Doc pdf,
|
1527
|
+
HPDF_Stream font_data,
|
1528
|
+
HPDF_UINT index,
|
1529
|
+
HPDF_BOOL embedding,
|
1530
|
+
const char *file_name)
|
1531
|
+
{
|
1532
|
+
HPDF_FontDef def;
|
1533
|
+
|
1534
|
+
HPDF_PTRACE ((" HPDF_LoadTTFontFromStream2\n"));
|
1535
|
+
|
1536
|
+
def = HPDF_TTFontDef_Load2 (pdf->mmgr, font_data, index, embedding);
|
1537
|
+
if (def) {
|
1538
|
+
HPDF_FontDef tmpdef = HPDF_Doc_FindFontDef (pdf, def->base_font);
|
1539
|
+
if (tmpdef) {
|
1540
|
+
HPDF_FontDef_Free (def);
|
1541
|
+
HPDF_SetError (&pdf->error, HPDF_FONT_EXISTS, 0);
|
1542
|
+
return NULL;
|
1543
|
+
}
|
1544
|
+
|
1545
|
+
if (HPDF_List_Add (pdf->fontdef_list, def) != HPDF_OK) {
|
1546
|
+
HPDF_FontDef_Free (def);
|
1547
|
+
return NULL;
|
1548
|
+
}
|
1549
|
+
} else
|
1550
|
+
return NULL;
|
1551
|
+
|
1552
|
+
if (embedding) {
|
1553
|
+
if (pdf->ttfont_tag[0] == 0) {
|
1554
|
+
HPDF_MemCpy (pdf->ttfont_tag, "HPDFAA", 6);
|
1555
|
+
} else {
|
1556
|
+
HPDF_INT i;
|
1557
|
+
|
1558
|
+
for (i = 5; i >= 0; i--) {
|
1559
|
+
pdf->ttfont_tag[i] += 1;
|
1560
|
+
if (pdf->ttfont_tag[i] > 'Z')
|
1561
|
+
pdf->ttfont_tag[i] = 'A';
|
1562
|
+
else
|
1563
|
+
break;
|
1564
|
+
}
|
1565
|
+
}
|
1566
|
+
|
1567
|
+
HPDF_TTFontDef_SetTagName (def, pdf->ttfont_tag);
|
1568
|
+
}
|
1569
|
+
|
1570
|
+
return def->base_font;
|
1571
|
+
}
|
1572
|
+
|
1573
|
+
|
1574
|
+
HPDF_EXPORT(HPDF_Image)
|
1575
|
+
HPDF_LoadRawImageFromFile (HPDF_Doc pdf,
|
1576
|
+
const char *filename,
|
1577
|
+
HPDF_UINT width,
|
1578
|
+
HPDF_UINT height,
|
1579
|
+
HPDF_ColorSpace color_space)
|
1580
|
+
{
|
1581
|
+
HPDF_Stream imagedata;
|
1582
|
+
HPDF_Image image;
|
1583
|
+
|
1584
|
+
HPDF_PTRACE ((" HPDF_LoadRawImageFromFile\n"));
|
1585
|
+
|
1586
|
+
if (!HPDF_HasDoc (pdf))
|
1587
|
+
return NULL;
|
1588
|
+
|
1589
|
+
/* create file stream */
|
1590
|
+
imagedata = HPDF_FileReader_New (pdf->mmgr, filename);
|
1591
|
+
|
1592
|
+
if (HPDF_Stream_Validate (imagedata))
|
1593
|
+
image = HPDF_Image_LoadRawImage (pdf->mmgr, imagedata, pdf->xref, width,
|
1594
|
+
height, color_space);
|
1595
|
+
else
|
1596
|
+
image = NULL;
|
1597
|
+
|
1598
|
+
/* destroy file stream */
|
1599
|
+
HPDF_Stream_Free (imagedata);
|
1600
|
+
|
1601
|
+
if (!image)
|
1602
|
+
HPDF_CheckError (&pdf->error);
|
1603
|
+
|
1604
|
+
if (pdf->compression_mode & HPDF_COMP_IMAGE)
|
1605
|
+
image->filter = HPDF_STREAM_FILTER_FLATE_DECODE;
|
1606
|
+
|
1607
|
+
return image;
|
1608
|
+
}
|
1609
|
+
|
1610
|
+
|
1611
|
+
HPDF_EXPORT(HPDF_Image)
|
1612
|
+
HPDF_LoadRawImageFromMem (HPDF_Doc pdf,
|
1613
|
+
const HPDF_BYTE *buf,
|
1614
|
+
HPDF_UINT width,
|
1615
|
+
HPDF_UINT height,
|
1616
|
+
HPDF_ColorSpace color_space,
|
1617
|
+
HPDF_UINT bits_per_component)
|
1618
|
+
{
|
1619
|
+
HPDF_Image image;
|
1620
|
+
|
1621
|
+
HPDF_PTRACE ((" HPDF_LoadRawImageFromMem\n"));
|
1622
|
+
|
1623
|
+
if (!HPDF_HasDoc (pdf))
|
1624
|
+
return NULL;
|
1625
|
+
|
1626
|
+
image = HPDF_Image_LoadRawImageFromMem (pdf->mmgr, buf, pdf->xref, width,
|
1627
|
+
height, color_space, bits_per_component);
|
1628
|
+
|
1629
|
+
if (!image)
|
1630
|
+
HPDF_CheckError (&pdf->error);
|
1631
|
+
|
1632
|
+
if (pdf->compression_mode & HPDF_COMP_IMAGE)
|
1633
|
+
image->filter = HPDF_STREAM_FILTER_FLATE_DECODE;
|
1634
|
+
|
1635
|
+
return image;
|
1636
|
+
}
|
1637
|
+
|
1638
|
+
|
1639
|
+
HPDF_EXPORT(HPDF_Image)
|
1640
|
+
HPDF_LoadJpegImageFromFile (HPDF_Doc pdf,
|
1641
|
+
const char *filename)
|
1642
|
+
{
|
1643
|
+
HPDF_Stream imagedata;
|
1644
|
+
HPDF_Image image;
|
1645
|
+
|
1646
|
+
HPDF_PTRACE ((" HPDF_LoadJpegImageFromFile\n"));
|
1647
|
+
|
1648
|
+
if (!HPDF_HasDoc (pdf))
|
1649
|
+
return NULL;
|
1650
|
+
|
1651
|
+
/* create file stream */
|
1652
|
+
imagedata = HPDF_FileReader_New (pdf->mmgr, filename);
|
1653
|
+
|
1654
|
+
if (HPDF_Stream_Validate (imagedata))
|
1655
|
+
image = HPDF_Image_LoadJpegImage (pdf->mmgr, imagedata, pdf->xref);
|
1656
|
+
else
|
1657
|
+
image = NULL;
|
1658
|
+
|
1659
|
+
/* destroy file stream */
|
1660
|
+
HPDF_Stream_Free (imagedata);
|
1661
|
+
|
1662
|
+
if (!image)
|
1663
|
+
HPDF_CheckError (&pdf->error);
|
1664
|
+
|
1665
|
+
return image;
|
1666
|
+
}
|
1667
|
+
|
1668
|
+
|
1669
|
+
/*----- Catalog ------------------------------------------------------------*/
|
1670
|
+
|
1671
|
+
HPDF_EXPORT(HPDF_PageLayout)
|
1672
|
+
HPDF_GetPageLayout (HPDF_Doc pdf)
|
1673
|
+
{
|
1674
|
+
HPDF_PTRACE ((" HPDF_GetPageLayout\n"));
|
1675
|
+
|
1676
|
+
if (!HPDF_HasDoc (pdf))
|
1677
|
+
return HPDF_PAGE_LAYOUT_SINGLE;
|
1678
|
+
|
1679
|
+
return HPDF_Catalog_GetPageLayout (pdf->catalog);
|
1680
|
+
}
|
1681
|
+
|
1682
|
+
|
1683
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1684
|
+
HPDF_SetPageLayout (HPDF_Doc pdf,
|
1685
|
+
HPDF_PageLayout layout)
|
1686
|
+
{
|
1687
|
+
HPDF_STATUS ret;
|
1688
|
+
|
1689
|
+
HPDF_PTRACE ((" HPDF_GetPageLayout\n"));
|
1690
|
+
|
1691
|
+
if (!HPDF_HasDoc (pdf))
|
1692
|
+
return HPDF_INVALID_DOCUMENT;
|
1693
|
+
|
1694
|
+
if (layout < 0 || layout >= HPDF_PAGE_LAYOUT_EOF)
|
1695
|
+
return HPDF_RaiseError (&pdf->error, HPDF_PAGE_LAYOUT_OUT_OF_RANGE,
|
1696
|
+
(HPDF_STATUS)layout);
|
1697
|
+
|
1698
|
+
ret = HPDF_Catalog_SetPageLayout (pdf->catalog, layout);
|
1699
|
+
if (ret != HPDF_OK)
|
1700
|
+
HPDF_CheckError (&pdf->error);
|
1701
|
+
|
1702
|
+
return HPDF_OK;
|
1703
|
+
}
|
1704
|
+
|
1705
|
+
HPDF_EXPORT(HPDF_PageMode)
|
1706
|
+
HPDF_GetPageMode (HPDF_Doc pdf)
|
1707
|
+
{
|
1708
|
+
HPDF_PTRACE ((" HPDF_GetPageMode\n"));
|
1709
|
+
|
1710
|
+
if (!HPDF_HasDoc (pdf))
|
1711
|
+
return HPDF_PAGE_MODE_USE_NONE;
|
1712
|
+
|
1713
|
+
return HPDF_Catalog_GetPageMode (pdf->catalog);
|
1714
|
+
}
|
1715
|
+
|
1716
|
+
|
1717
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1718
|
+
HPDF_SetPageMode (HPDF_Doc pdf,
|
1719
|
+
HPDF_PageMode mode)
|
1720
|
+
{
|
1721
|
+
HPDF_STATUS ret;
|
1722
|
+
|
1723
|
+
HPDF_PTRACE ((" HPDF_GetPageMode\n"));
|
1724
|
+
|
1725
|
+
if (!HPDF_HasDoc (pdf))
|
1726
|
+
return HPDF_INVALID_DOCUMENT;
|
1727
|
+
|
1728
|
+
if (mode < 0 || mode >= HPDF_PAGE_MODE_EOF)
|
1729
|
+
return HPDF_RaiseError (&pdf->error, HPDF_PAGE_MODE_OUT_OF_RANGE,
|
1730
|
+
(HPDF_STATUS)mode);
|
1731
|
+
|
1732
|
+
ret = HPDF_Catalog_SetPageMode (pdf->catalog, mode);
|
1733
|
+
if (ret != HPDF_OK)
|
1734
|
+
return HPDF_CheckError (&pdf->error);
|
1735
|
+
|
1736
|
+
return HPDF_OK;
|
1737
|
+
}
|
1738
|
+
|
1739
|
+
|
1740
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1741
|
+
HPDF_SetOpenAction (HPDF_Doc pdf,
|
1742
|
+
HPDF_Destination open_action)
|
1743
|
+
{
|
1744
|
+
HPDF_STATUS ret;
|
1745
|
+
|
1746
|
+
HPDF_PTRACE ((" HPDF_SetOpenAction\n"));
|
1747
|
+
|
1748
|
+
if (!HPDF_HasDoc (pdf))
|
1749
|
+
return HPDF_INVALID_DOCUMENT;
|
1750
|
+
|
1751
|
+
if (open_action && !HPDF_Destination_Validate (open_action))
|
1752
|
+
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_DESTINATION, 0);
|
1753
|
+
|
1754
|
+
ret = HPDF_Catalog_SetOpenAction (pdf->catalog, open_action);
|
1755
|
+
if (ret != HPDF_OK)
|
1756
|
+
return HPDF_CheckError (&pdf->error);
|
1757
|
+
|
1758
|
+
return HPDF_OK;
|
1759
|
+
}
|
1760
|
+
|
1761
|
+
|
1762
|
+
HPDF_EXPORT(HPDF_UINT)
|
1763
|
+
HPDF_GetViewerPreference (HPDF_Doc pdf)
|
1764
|
+
{
|
1765
|
+
HPDF_PTRACE ((" HPDF_Catalog_GetViewerPreference\n"));
|
1766
|
+
|
1767
|
+
if (!HPDF_HasDoc (pdf))
|
1768
|
+
return 0;
|
1769
|
+
|
1770
|
+
return HPDF_Catalog_GetViewerPreference (pdf->catalog);
|
1771
|
+
}
|
1772
|
+
|
1773
|
+
|
1774
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1775
|
+
HPDF_SetViewerPreference (HPDF_Doc pdf,
|
1776
|
+
HPDF_UINT value)
|
1777
|
+
{
|
1778
|
+
HPDF_STATUS ret;
|
1779
|
+
|
1780
|
+
HPDF_PTRACE ((" HPDF_Catalog_SetViewerPreference\n"));
|
1781
|
+
|
1782
|
+
if (!HPDF_HasDoc (pdf))
|
1783
|
+
return HPDF_INVALID_DOCUMENT;
|
1784
|
+
|
1785
|
+
ret = HPDF_Catalog_SetViewerPreference (pdf->catalog, value);
|
1786
|
+
if (ret != HPDF_OK)
|
1787
|
+
return HPDF_CheckError (&pdf->error);
|
1788
|
+
|
1789
|
+
return HPDF_OK;
|
1790
|
+
}
|
1791
|
+
|
1792
|
+
|
1793
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1794
|
+
HPDF_AddPageLabel (HPDF_Doc pdf,
|
1795
|
+
HPDF_UINT page_num,
|
1796
|
+
HPDF_PageNumStyle style,
|
1797
|
+
HPDF_UINT first_page,
|
1798
|
+
const char *prefix)
|
1799
|
+
{
|
1800
|
+
HPDF_Dict page_label;
|
1801
|
+
HPDF_STATUS ret;
|
1802
|
+
|
1803
|
+
HPDF_PTRACE ((" HPDF_AddPageLabel\n"));
|
1804
|
+
|
1805
|
+
if (!HPDF_HasDoc (pdf))
|
1806
|
+
return HPDF_INVALID_DOCUMENT;
|
1807
|
+
|
1808
|
+
page_label = HPDF_PageLabel_New (pdf, style, first_page, prefix);
|
1809
|
+
|
1810
|
+
if (!page_label)
|
1811
|
+
return HPDF_CheckError (&pdf->error);
|
1812
|
+
|
1813
|
+
if (style < 0 || style >= HPDF_PAGE_NUM_STYLE_EOF)
|
1814
|
+
return HPDF_RaiseError (&pdf->error, HPDF_PAGE_NUM_STYLE_OUT_OF_RANGE,
|
1815
|
+
(HPDF_STATUS)style);
|
1816
|
+
|
1817
|
+
ret = HPDF_Catalog_AddPageLabel (pdf->catalog, page_num, page_label);
|
1818
|
+
if (ret != HPDF_OK)
|
1819
|
+
return HPDF_CheckError (&pdf->error);
|
1820
|
+
|
1821
|
+
return HPDF_OK;
|
1822
|
+
}
|
1823
|
+
|
1824
|
+
|
1825
|
+
/*----- Info ---------------------------------------------------------------*/
|
1826
|
+
|
1827
|
+
static HPDF_Dict
|
1828
|
+
GetInfo (HPDF_Doc pdf)
|
1829
|
+
{
|
1830
|
+
if (!HPDF_HasDoc (pdf))
|
1831
|
+
return NULL;
|
1832
|
+
|
1833
|
+
if (!pdf->info) {
|
1834
|
+
pdf->info = HPDF_Dict_New (pdf->mmgr);
|
1835
|
+
|
1836
|
+
if (!pdf->info || HPDF_Xref_Add (pdf->xref, pdf->info) != HPDF_OK)
|
1837
|
+
pdf->info = NULL;
|
1838
|
+
}
|
1839
|
+
|
1840
|
+
return pdf->info;
|
1841
|
+
}
|
1842
|
+
|
1843
|
+
|
1844
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1845
|
+
HPDF_SetInfoAttr (HPDF_Doc pdf,
|
1846
|
+
HPDF_InfoType type,
|
1847
|
+
const char *value)
|
1848
|
+
{
|
1849
|
+
HPDF_STATUS ret;
|
1850
|
+
HPDF_Dict info = GetInfo (pdf);
|
1851
|
+
|
1852
|
+
HPDF_PTRACE((" HPDF_SetInfoAttr\n"));
|
1853
|
+
|
1854
|
+
if (!info)
|
1855
|
+
return HPDF_CheckError (&pdf->error);
|
1856
|
+
|
1857
|
+
ret = HPDF_Info_SetInfoAttr (info, type, value, pdf->cur_encoder);
|
1858
|
+
if (ret != HPDF_OK)
|
1859
|
+
return HPDF_CheckError (&pdf->error);
|
1860
|
+
|
1861
|
+
return ret;
|
1862
|
+
}
|
1863
|
+
|
1864
|
+
|
1865
|
+
HPDF_EXPORT(const char*)
|
1866
|
+
HPDF_GetInfoAttr (HPDF_Doc pdf,
|
1867
|
+
HPDF_InfoType type)
|
1868
|
+
{
|
1869
|
+
const char *ret = NULL;
|
1870
|
+
HPDF_Dict info = GetInfo (pdf);
|
1871
|
+
|
1872
|
+
HPDF_PTRACE((" HPDF_GetInfoAttr\n"));
|
1873
|
+
|
1874
|
+
if (info)
|
1875
|
+
ret = HPDF_Info_GetInfoAttr (info, type);
|
1876
|
+
else
|
1877
|
+
HPDF_CheckError (&pdf->error);
|
1878
|
+
|
1879
|
+
return ret;
|
1880
|
+
}
|
1881
|
+
|
1882
|
+
|
1883
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1884
|
+
HPDF_SetInfoDateAttr (HPDF_Doc pdf,
|
1885
|
+
HPDF_InfoType type,
|
1886
|
+
HPDF_Date value)
|
1887
|
+
{
|
1888
|
+
HPDF_STATUS ret;
|
1889
|
+
HPDF_Dict info = GetInfo (pdf);
|
1890
|
+
|
1891
|
+
HPDF_PTRACE((" HPDF_SetInfoDateAttr\n"));
|
1892
|
+
|
1893
|
+
if (!info)
|
1894
|
+
return HPDF_CheckError (&pdf->error);
|
1895
|
+
|
1896
|
+
ret = HPDF_Info_SetInfoDateAttr (info, type, value);
|
1897
|
+
if (ret != HPDF_OK)
|
1898
|
+
return HPDF_CheckError (&pdf->error);
|
1899
|
+
|
1900
|
+
return ret;
|
1901
|
+
}
|
1902
|
+
|
1903
|
+
|
1904
|
+
HPDF_EXPORT(HPDF_Outline)
|
1905
|
+
HPDF_CreateOutline (HPDF_Doc pdf,
|
1906
|
+
HPDF_Outline parent,
|
1907
|
+
const char *title,
|
1908
|
+
HPDF_Encoder encoder)
|
1909
|
+
{
|
1910
|
+
HPDF_Outline outline;
|
1911
|
+
|
1912
|
+
if (!HPDF_HasDoc (pdf))
|
1913
|
+
return NULL;
|
1914
|
+
|
1915
|
+
if (!parent) {
|
1916
|
+
if (pdf->outlines) {
|
1917
|
+
parent = pdf->outlines;
|
1918
|
+
} else {
|
1919
|
+
pdf->outlines = HPDF_OutlineRoot_New (pdf->mmgr, pdf->xref);
|
1920
|
+
|
1921
|
+
if (pdf->outlines) {
|
1922
|
+
HPDF_STATUS ret = HPDF_Dict_Add (pdf->catalog, "Outlines",
|
1923
|
+
pdf->outlines);
|
1924
|
+
if (ret != HPDF_OK) {
|
1925
|
+
HPDF_CheckError (&pdf->error);
|
1926
|
+
pdf->outlines = NULL;
|
1927
|
+
return NULL;
|
1928
|
+
}
|
1929
|
+
|
1930
|
+
parent = pdf->outlines;
|
1931
|
+
} else {
|
1932
|
+
HPDF_CheckError (&pdf->error);
|
1933
|
+
return NULL;
|
1934
|
+
}
|
1935
|
+
}
|
1936
|
+
}
|
1937
|
+
|
1938
|
+
if (!HPDF_Outline_Validate (parent) || pdf->mmgr != parent->mmgr) {
|
1939
|
+
HPDF_RaiseError (&pdf->error, HPDF_INVALID_OUTLINE, 0);
|
1940
|
+
return NULL;
|
1941
|
+
}
|
1942
|
+
|
1943
|
+
outline = HPDF_Outline_New (pdf->mmgr, parent, title, encoder, pdf->xref);
|
1944
|
+
if (!outline)
|
1945
|
+
HPDF_CheckError (&pdf->error);
|
1946
|
+
|
1947
|
+
return outline;
|
1948
|
+
}
|
1949
|
+
|
1950
|
+
|
1951
|
+
HPDF_EXPORT(HPDF_ExtGState)
|
1952
|
+
HPDF_CreateExtGState (HPDF_Doc pdf)
|
1953
|
+
{
|
1954
|
+
HPDF_ExtGState ext_gstate;
|
1955
|
+
|
1956
|
+
if (!HPDF_HasDoc (pdf))
|
1957
|
+
return NULL;
|
1958
|
+
|
1959
|
+
pdf->pdf_version = HPDF_VER_14;
|
1960
|
+
|
1961
|
+
ext_gstate = HPDF_ExtGState_New (pdf->mmgr, pdf->xref);
|
1962
|
+
if (!ext_gstate)
|
1963
|
+
HPDF_CheckError (&pdf->error);
|
1964
|
+
|
1965
|
+
return ext_gstate;
|
1966
|
+
}
|
1967
|
+
|
1968
|
+
|
1969
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1970
|
+
HPDF_SetCompressionMode (HPDF_Doc pdf,
|
1971
|
+
HPDF_UINT mode)
|
1972
|
+
{
|
1973
|
+
if (!HPDF_Doc_Validate (pdf))
|
1974
|
+
return HPDF_INVALID_DOCUMENT;
|
1975
|
+
|
1976
|
+
if (mode != (mode & HPDF_COMP_MASK))
|
1977
|
+
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_COMPRESSION_MODE, 0);
|
1978
|
+
|
1979
|
+
#ifndef HPDF_NOZLIB
|
1980
|
+
pdf->compression_mode = mode;
|
1981
|
+
|
1982
|
+
return HPDF_OK;
|
1983
|
+
|
1984
|
+
#else /* HPDF_NOZLIB */
|
1985
|
+
|
1986
|
+
return HPDF_INVALID_COMPRESSION_MODE;
|
1987
|
+
|
1988
|
+
#endif /* HPDF_NOZLIB */
|
1989
|
+
}
|
1990
|
+
|
1991
|
+
|
1992
|
+
HPDF_EXPORT(HPDF_STATUS)
|
1993
|
+
HPDF_GetError (HPDF_Doc pdf)
|
1994
|
+
{
|
1995
|
+
if (!HPDF_Doc_Validate (pdf))
|
1996
|
+
return HPDF_INVALID_DOCUMENT;
|
1997
|
+
|
1998
|
+
return HPDF_Error_GetCode (&pdf->error);
|
1999
|
+
}
|
2000
|
+
|
2001
|
+
|
2002
|
+
HPDF_EXPORT(HPDF_STATUS)
|
2003
|
+
HPDF_GetErrorDetail (HPDF_Doc pdf)
|
2004
|
+
{
|
2005
|
+
if (!HPDF_Doc_Validate (pdf))
|
2006
|
+
return HPDF_INVALID_DOCUMENT;
|
2007
|
+
|
2008
|
+
return HPDF_Error_GetDetailCode (&pdf->error);
|
2009
|
+
}
|
2010
|
+
|
2011
|
+
|
2012
|
+
HPDF_EXPORT(void)
|
2013
|
+
HPDF_ResetError (HPDF_Doc pdf)
|
2014
|
+
{
|
2015
|
+
if (!HPDF_Doc_Validate (pdf))
|
2016
|
+
return;
|
2017
|
+
|
2018
|
+
HPDF_Error_Reset (&pdf->error);
|
2019
|
+
}
|
2020
|
+
|