2
* << Haru Free PDF Library >> -- hpdf_doc.c
4
* URL: http://libharu.org
6
* Copyright (c) 1999-2006 Takeshi Kanno <takeshi_kanno@est.hi-ho.ne.jp>
7
* Copyright (c) 2007-2008 Antony Dovgal <tony@daylessday.org>
9
* Permission to use, copy, modify, distribute and sell this software
10
* and its documentation for any purpose is hereby granted without fee,
11
* provided that the above copyright notice appear in all copies and
12
* that both that copyright notice and this permission notice appear
13
* in supporting documentation.
14
* It is provided "as is" without express or implied warranty.
19
#include "hpdf_conf.h"
20
#include "hpdf_utils.h"
21
#include "hpdf_encryptdict.h"
22
#include "hpdf_destination.h"
23
#include "hpdf_info.h"
24
#include "hpdf_page_label.h"
28
static const char *HPDF_VERSION_STR[6] = {
29
"%PDF-1.2\012%\267\276\255\252\012",
30
"%PDF-1.3\012%\267\276\255\252\012",
31
"%PDF-1.4\012%\267\276\255\252\012",
32
"%PDF-1.5\012%\267\276\255\252\012",
33
"%PDF-1.6\012%\267\276\255\252\012",
34
"%PDF-1.7\012%\267\276\255\252\012"
39
WriteHeader (HPDF_Doc pdf,
44
PrepareTrailer (HPDF_Doc pdf);
48
FreeEncoderList (HPDF_Doc pdf);
52
FreeFontDefList (HPDF_Doc pdf);
56
CleanupFontDefList (HPDF_Doc pdf);
60
GetInfo (HPDF_Doc pdf);
63
InternalSaveToStream (HPDF_Doc pdf,
67
LoadType1FontFromStream (HPDF_Doc pdf,
73
LoadTTFontFromStream (HPDF_Doc pdf,
74
HPDF_Stream font_data,
76
const char *file_name);
80
LoadTTFontFromStream2 (HPDF_Doc pdf,
81
HPDF_Stream font_data,
84
const char *file_name);
87
/*---------------------------------------------------------------------------*/
89
HPDF_EXPORT(const char *)
90
HPDF_GetVersion (void)
92
return HPDF_VERSION_TEXT;
97
HPDF_Doc_Validate (HPDF_Doc pdf)
99
HPDF_PTRACE ((" HPDF_Doc_Validate\n"));
101
if (!pdf || pdf->sig_bytes != HPDF_SIG_BYTES)
108
HPDF_EXPORT(HPDF_BOOL)
109
HPDF_HasDoc (HPDF_Doc pdf)
111
HPDF_PTRACE ((" HPDF_HasDoc\n"));
113
if (!pdf || pdf->sig_bytes != HPDF_SIG_BYTES)
116
if (!pdf->catalog || pdf->error.error_no != HPDF_NOERROR) {
117
HPDF_RaiseError (&pdf->error, HPDF_INVALID_DOCUMENT, 0);
124
HPDF_EXPORT(HPDF_Doc)
125
HPDF_New (HPDF_Error_Handler user_error_fn,
128
HPDF_PTRACE ((" HPDF_New\n"));
130
return HPDF_NewEx (user_error_fn, NULL, NULL, 0, user_data);
134
HPDF_EXPORT(HPDF_Doc)
135
HPDF_NewEx (HPDF_Error_Handler user_error_fn,
136
HPDF_Alloc_Func user_alloc_fn,
137
HPDF_Free_Func user_free_fn,
138
HPDF_UINT mem_pool_buf_size,
143
HPDF_Error_Rec tmp_error;
145
HPDF_PTRACE ((" HPDF_NewEx\n"));
147
/* initialize temporary-error object */
148
HPDF_Error_Init (&tmp_error, user_data);
150
/* create memory-manager object */
151
mmgr = HPDF_MMgr_New (&tmp_error, mem_pool_buf_size, user_alloc_fn,
154
HPDF_CheckError (&tmp_error);
158
/* now create pdf_doc object */
159
pdf = HPDF_GetMem (mmgr, sizeof (HPDF_Doc_Rec));
161
HPDF_MMgr_Free (mmgr);
162
HPDF_CheckError (&tmp_error);
166
HPDF_MemSet (pdf, 0, sizeof (HPDF_Doc_Rec));
167
pdf->sig_bytes = HPDF_SIG_BYTES;
169
pdf->pdf_version = HPDF_VER_13;
170
pdf->compression_mode = HPDF_COMP_NONE;
172
/* copy the data of temporary-error object to the one which is
173
included in pdf_doc object */
174
pdf->error = tmp_error;
176
/* switch the error-object of memory-manager */
177
mmgr->error = &pdf->error;
179
if (HPDF_NewDoc (pdf) != HPDF_OK) {
181
HPDF_CheckError (&tmp_error);
185
pdf->error.error_fn = user_error_fn;
192
HPDF_Free (HPDF_Doc pdf)
194
HPDF_PTRACE ((" HPDF_Free\n"));
197
HPDF_MMgr mmgr = pdf->mmgr;
199
HPDF_FreeDocAll (pdf);
203
HPDF_FreeMem (mmgr, pdf);
204
HPDF_MMgr_Free (mmgr);
209
HPDF_EXPORT(HPDF_STATUS)
210
HPDF_NewDoc (HPDF_Doc pdf)
212
char buf[HPDF_TMP_BUF_SIZ];
214
char *eptr = buf + HPDF_TMP_BUF_SIZ - 1;
217
HPDF_PTRACE ((" HPDF_NewDoc\n"));
219
if (!HPDF_Doc_Validate (pdf))
220
return HPDF_DOC_INVALID_OBJECT;
224
pdf->xref = HPDF_Xref_New (pdf->mmgr, 0);
226
return HPDF_CheckError (&pdf->error);
228
pdf->trailer = pdf->xref->trailer;
230
pdf->font_mgr = HPDF_List_New (pdf->mmgr, HPDF_DEF_ITEMS_PER_BLOCK);
232
return HPDF_CheckError (&pdf->error);
234
if (!pdf->fontdef_list) {
235
pdf->fontdef_list = HPDF_List_New (pdf->mmgr,
236
HPDF_DEF_ITEMS_PER_BLOCK);
237
if (!pdf->fontdef_list)
238
return HPDF_CheckError (&pdf->error);
241
if (!pdf->encoder_list) {
242
pdf->encoder_list = HPDF_List_New (pdf->mmgr,
243
HPDF_DEF_ITEMS_PER_BLOCK);
244
if (!pdf->encoder_list)
245
return HPDF_CheckError (&pdf->error);
248
pdf->catalog = HPDF_Catalog_New (pdf->mmgr, pdf->xref);
250
return HPDF_CheckError (&pdf->error);
252
pdf->root_pages = HPDF_Catalog_GetRoot (pdf->catalog);
253
if (!pdf->root_pages)
254
return HPDF_CheckError (&pdf->error);
256
pdf->page_list = HPDF_List_New (pdf->mmgr, HPDF_DEF_PAGE_LIST_NUM);
258
return HPDF_CheckError (&pdf->error);
260
pdf->cur_pages = pdf->root_pages;
262
ptr = (char *)HPDF_StrCpy (ptr, (const char *)"Haru Free PDF Library ", eptr);
263
version = HPDF_GetVersion ();
264
HPDF_StrCpy (ptr, version, eptr);
266
if (HPDF_SetInfoAttr (pdf, HPDF_INFO_PRODUCER, buf) != HPDF_OK)
267
return HPDF_CheckError (&pdf->error);
274
HPDF_FreeDoc (HPDF_Doc pdf)
276
HPDF_PTRACE ((" HPDF_FreeDoc\n"));
278
if (HPDF_Doc_Validate (pdf)) {
280
HPDF_Xref_Free (pdf->xref);
285
HPDF_List_Free (pdf->font_mgr);
286
pdf->font_mgr = NULL;
289
if (pdf->fontdef_list)
290
CleanupFontDefList (pdf);
292
HPDF_MemSet(pdf->ttfont_tag, 0, 6);
294
pdf->pdf_version = HPDF_VER_13;
295
pdf->outlines = NULL;
297
pdf->root_pages = NULL;
298
pdf->cur_pages = NULL;
299
pdf->cur_page = NULL;
300
pdf->encrypt_on = HPDF_FALSE;
301
pdf->cur_page_num = 0;
302
pdf->cur_encoder = NULL;
303
pdf->def_encoder = NULL;
304
pdf->page_per_pages = 0;
306
if (pdf->page_list) {
307
HPDF_List_Free (pdf->page_list);
308
pdf->page_list = NULL;
311
pdf->encrypt_dict = NULL;
314
HPDF_Error_Reset (&pdf->error);
317
HPDF_Stream_Free (pdf->stream);
325
HPDF_FreeDocAll (HPDF_Doc pdf)
327
HPDF_PTRACE ((" HPDF_FreeDocAll\n"));
329
if (HPDF_Doc_Validate (pdf)) {
332
if (pdf->fontdef_list)
333
FreeFontDefList (pdf);
335
if (pdf->encoder_list)
336
FreeEncoderList (pdf);
338
pdf->compression_mode = HPDF_COMP_NONE;
340
HPDF_Error_Reset (&pdf->error);
345
HPDF_EXPORT(HPDF_STATUS)
346
HPDF_SetPagesConfiguration (HPDF_Doc pdf,
347
HPDF_UINT page_per_pages)
349
HPDF_PTRACE ((" HPDF_SetPagesConfiguration\n"));
351
if (!HPDF_HasDoc (pdf))
352
return HPDF_INVALID_DOCUMENT;
355
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_DOCUMENT_STATE, 0);
357
if (page_per_pages > HPDF_LIMIT_MAX_ARRAY)
358
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_PARAMETER, 0);
360
if (pdf->cur_pages == pdf->root_pages) {
361
pdf->cur_pages = HPDF_Doc_AddPagesTo (pdf, pdf->root_pages);
363
return pdf->error.error_no;
364
pdf->cur_page_num = 0;
367
pdf->page_per_pages = page_per_pages;
374
WriteHeader (HPDF_Doc pdf,
377
HPDF_UINT idx = (HPDF_INT)pdf->pdf_version;
379
HPDF_PTRACE ((" WriteHeader\n"));
381
if (HPDF_Stream_WriteStr (stream, HPDF_VERSION_STR[idx]) != HPDF_OK)
382
return pdf->error.error_no;
389
PrepareTrailer (HPDF_Doc pdf)
391
HPDF_PTRACE ((" PrepareTrailer\n"));
393
if (HPDF_Dict_Add (pdf->trailer, "Root", pdf->catalog) != HPDF_OK)
394
return pdf->error.error_no;
396
if (HPDF_Dict_Add (pdf->trailer, "Info", pdf->info) != HPDF_OK)
397
return pdf->error.error_no;
404
HPDF_Doc_SetEncryptOn (HPDF_Doc pdf)
406
HPDF_PTRACE ((" HPDF_Doc_SetEncryptOn\n"));
411
if (!pdf->encrypt_dict)
412
return HPDF_SetError (&pdf->error, HPDF_DOC_ENCRYPTDICT_NOT_FOUND,
415
if (pdf->encrypt_dict->header.obj_id == HPDF_OTYPE_NONE)
416
if (HPDF_Xref_Add (pdf->xref, pdf->encrypt_dict) != HPDF_OK)
417
return pdf->error.error_no;
419
if (HPDF_Dict_Add (pdf->trailer, "Encrypt", pdf->encrypt_dict) != HPDF_OK)
420
return pdf->error.error_no;
422
pdf->encrypt_on = HPDF_TRUE;
427
HPDF_EXPORT(HPDF_STATUS)
428
HPDF_SetPassword (HPDF_Doc pdf,
429
const char *owner_passwd,
430
const char *user_passwd)
432
HPDF_PTRACE ((" HPDF_SetPassword\n"));
434
if (!HPDF_HasDoc (pdf))
435
return HPDF_DOC_INVALID_OBJECT;
437
if (!pdf->encrypt_dict) {
438
pdf->encrypt_dict = HPDF_EncryptDict_New (pdf->mmgr, pdf->xref);
440
if (!pdf->encrypt_dict)
441
return HPDF_CheckError (&pdf->error);
444
if (HPDF_EncryptDict_SetPassword (pdf->encrypt_dict, owner_passwd,
445
user_passwd) != HPDF_OK)
446
return HPDF_CheckError (&pdf->error);
448
return HPDF_Doc_SetEncryptOn (pdf);
452
HPDF_EXPORT(HPDF_STATUS)
453
HPDF_SetPermission (HPDF_Doc pdf,
454
HPDF_UINT permission)
458
HPDF_PTRACE ((" HPDF_SetPermission\n"));
460
if (!HPDF_HasDoc (pdf))
461
return HPDF_DOC_INVALID_OBJECT;
463
e = HPDF_EncryptDict_GetAttr (pdf->encrypt_dict);
466
return HPDF_RaiseError (&pdf->error,
467
HPDF_DOC_ENCRYPTDICT_NOT_FOUND, 0);
469
e->permission = permission;
475
HPDF_EXPORT(HPDF_STATUS)
476
HPDF_SetEncryptionMode (HPDF_Doc pdf,
477
HPDF_EncryptMode mode,
482
HPDF_PTRACE ((" HPDF_SetEncryptionMode\n"));
484
if (!HPDF_Doc_Validate (pdf))
485
return HPDF_DOC_INVALID_OBJECT;
487
e = HPDF_EncryptDict_GetAttr (pdf->encrypt_dict);
490
return HPDF_RaiseError (&pdf->error,
491
HPDF_DOC_ENCRYPTDICT_NOT_FOUND, 0);
493
if (mode == HPDF_ENCRYPT_R2)
496
/* if encryption mode is specified revision-3, the version of
497
* pdf file is set to 1.4
499
pdf->pdf_version = HPDF_VER_14;
501
if (key_len >= 5 && key_len <= 16)
502
e->key_len = key_len;
503
else if (key_len == 0)
506
return HPDF_RaiseError (&pdf->error,
507
HPDF_INVALID_ENCRYPT_KEY_LEN, 0);
517
HPDF_Doc_SetEncryptOff (HPDF_Doc pdf)
519
HPDF_PTRACE ((" HPDF_Doc_SetEncryptOff\n"));
521
if (!pdf->encrypt_on)
524
/* if encrypy-dict object is registered to cross-reference-table,
525
* replace it to null-object.
526
* additionally remove encrypt-dict object from trailer-object.
528
if (pdf->encrypt_dict) {
529
HPDF_UINT obj_id = pdf->encrypt_dict->header.obj_id;
531
if (obj_id & HPDF_OTYPE_INDIRECT) {
532
HPDF_XrefEntry entry;
535
HPDF_Dict_RemoveElement (pdf->trailer, "Encrypt");
537
entry = HPDF_Xref_GetEntryByObjectId (pdf->xref,
538
obj_id & 0x00FFFFFF);
541
return HPDF_SetError (&pdf->error,
542
HPDF_DOC_ENCRYPTDICT_NOT_FOUND, 0);
545
null_obj = HPDF_Null_New (pdf->mmgr);
547
return pdf->error.error_no;
549
entry->obj = null_obj;
550
null_obj->header.obj_id = obj_id | HPDF_OTYPE_INDIRECT;
552
pdf->encrypt_dict->header.obj_id = HPDF_OTYPE_NONE;
556
pdf->encrypt_on = HPDF_FALSE;
562
HPDF_Doc_PrepareEncryption (HPDF_Doc pdf)
564
HPDF_Encrypt e= HPDF_EncryptDict_GetAttr (pdf->encrypt_dict);
565
HPDF_Dict info = GetInfo (pdf);
569
return HPDF_DOC_ENCRYPTDICT_NOT_FOUND;
572
return pdf->error.error_no;
574
if (HPDF_EncryptDict_Prepare (pdf->encrypt_dict, info, pdf->xref) !=
576
return pdf->error.error_no;
578
/* reset 'ID' to trailer-dictionary */
579
id = HPDF_Dict_GetItem (pdf->trailer, "ID", HPDF_OCLASS_ARRAY);
581
id = HPDF_Array_New (pdf->mmgr);
583
if (!id || HPDF_Dict_Add (pdf->trailer, "ID", id) != HPDF_OK)
584
return pdf->error.error_no;
586
HPDF_Array_Clear (id);
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;
592
if (HPDF_Array_Add (id, HPDF_Binary_New (pdf->mmgr, e->encrypt_id,
593
HPDF_ID_LEN)) != HPDF_OK)
594
return pdf->error.error_no;
601
InternalSaveToStream (HPDF_Doc pdf,
606
if ((ret = WriteHeader (pdf, stream)) != HPDF_OK)
609
/* prepare trailer */
610
if ((ret = PrepareTrailer (pdf)) != HPDF_OK)
613
/* prepare encription */
614
if (pdf->encrypt_on) {
615
HPDF_Encrypt e= HPDF_EncryptDict_GetAttr (pdf->encrypt_dict);
617
if ((ret = HPDF_Doc_PrepareEncryption (pdf)) != HPDF_OK)
620
if ((ret = HPDF_Xref_WriteToStream (pdf->xref, stream, e)) != HPDF_OK)
623
if ((ret = HPDF_Xref_WriteToStream (pdf->xref, stream, NULL)) !=
632
HPDF_EXPORT(HPDF_STATUS)
633
HPDF_SaveToStream (HPDF_Doc pdf)
635
HPDF_PTRACE ((" HPDF_SaveToStream\n"));
637
if (!HPDF_HasDoc (pdf))
638
return HPDF_INVALID_DOCUMENT;
641
pdf->stream = HPDF_MemStream_New (pdf->mmgr, HPDF_STREAM_BUF_SIZ);
643
if (!HPDF_Stream_Validate (pdf->stream))
644
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_STREAM, 0);
646
HPDF_MemStream_FreeData (pdf->stream);
648
if (InternalSaveToStream (pdf, pdf->stream) != HPDF_OK)
649
return HPDF_CheckError (&pdf->error);
655
HPDF_EXPORT(HPDF_UINT32)
656
HPDF_GetStreamSize (HPDF_Doc pdf)
658
HPDF_PTRACE ((" HPDF_GetStreamSize\n"));
660
if (!HPDF_HasDoc (pdf))
661
return HPDF_INVALID_DOCUMENT;
663
if (!HPDF_Stream_Validate (pdf->stream))
666
return HPDF_Stream_Size(pdf->stream);
670
HPDF_EXPORT(HPDF_STATUS)
671
HPDF_ReadFromStream (HPDF_Doc pdf,
675
HPDF_UINT isize = *size;
678
if (!HPDF_HasDoc (pdf))
679
return HPDF_INVALID_DOCUMENT;
681
if (!HPDF_Stream_Validate (pdf->stream))
682
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_OPERATION, 0);
685
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_PARAMETER, 0);
687
ret = HPDF_Stream_Read (pdf->stream, buf, &isize);
692
HPDF_CheckError (&pdf->error);
698
HPDF_EXPORT(HPDF_STATUS)
699
HPDF_ResetStream (HPDF_Doc pdf)
701
if (!HPDF_HasDoc (pdf))
702
return HPDF_INVALID_DOCUMENT;
704
if (!HPDF_Stream_Validate (pdf->stream))
705
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_OPERATION, 0);
707
return HPDF_Stream_Seek (pdf->stream, 0, HPDF_SEEK_SET);
711
HPDF_EXPORT(HPDF_STATUS)
712
HPDF_SaveToFile (HPDF_Doc pdf,
713
const char *file_name)
717
HPDF_PTRACE ((" HPDF_SaveToFile\n"));
719
if (!HPDF_HasDoc (pdf))
720
return HPDF_INVALID_DOCUMENT;
722
stream = HPDF_FileWriter_New (pdf->mmgr, file_name);
724
return HPDF_CheckError (&pdf->error);
726
InternalSaveToStream (pdf, stream);
728
HPDF_Stream_Free (stream);
730
return HPDF_CheckError (&pdf->error);
734
HPDF_EXPORT(HPDF_Page)
735
HPDF_GetCurrentPage (HPDF_Doc pdf)
737
HPDF_PTRACE ((" HPDF_GetCurrentPage\n"));
739
if (!HPDF_HasDoc (pdf))
742
return pdf->cur_page;
746
HPDF_EXPORT(HPDF_Page)
747
HPDF_GetPageByIndex (HPDF_Doc pdf,
752
HPDF_PTRACE ((" HPDF_GetPageByIndex\n"));
754
if (!HPDF_HasDoc (pdf))
757
ret = HPDF_List_ItemAt (pdf->page_list, index);
759
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGE_INDEX, 0);
768
HPDF_Doc_GetCurrentPages (HPDF_Doc pdf)
770
HPDF_PTRACE ((" HPDF_GetCurrentPages\n"));
772
if (!HPDF_HasDoc (pdf))
775
return pdf->cur_pages;
780
HPDF_Doc_SetCurrentPages (HPDF_Doc pdf,
783
HPDF_PTRACE ((" HPDF_Doc_SetCurrentPages\n"));
785
if (!HPDF_HasDoc (pdf))
786
return HPDF_INVALID_DOCUMENT;
788
if (!HPDF_Pages_Validate (pages))
789
return HPDF_SetError (&pdf->error, HPDF_INVALID_PAGES, 0);
791
/* check whether the pages belong to the pdf */
792
if (pdf->mmgr != pages->mmgr)
793
return HPDF_SetError (&pdf->error, HPDF_INVALID_PAGES, 0);
795
pdf->cur_pages = pages;
802
HPDF_Doc_SetCurrentPage (HPDF_Doc pdf,
805
HPDF_PTRACE ((" HPDF_Doc_SetCurrentPage\n"));
807
if (!HPDF_HasDoc (pdf))
808
return HPDF_INVALID_DOCUMENT;
810
if (!HPDF_Page_Validate (page))
811
return HPDF_SetError (&pdf->error, HPDF_INVALID_PAGE, 0);
813
/* check whether the page belong to the pdf */
814
if (pdf->mmgr != page->mmgr)
815
return HPDF_SetError (&pdf->error, HPDF_INVALID_PAGE, 0);
817
pdf->cur_page = page;
823
HPDF_EXPORT(HPDF_Page)
824
HPDF_AddPage (HPDF_Doc pdf)
829
HPDF_PTRACE ((" HPDF_AddPage\n"));
831
if (!HPDF_HasDoc (pdf))
834
if (pdf->page_per_pages) {
835
if (pdf->page_per_pages <= pdf->cur_page_num) {
836
pdf->cur_pages = HPDF_Doc_AddPagesTo (pdf, pdf->root_pages);
839
pdf->cur_page_num = 0;
843
page = HPDF_Page_New (pdf->mmgr, pdf->xref);
845
HPDF_CheckError (&pdf->error);
849
if ((ret = HPDF_Pages_AddKids (pdf->cur_pages, page)) != HPDF_OK) {
850
HPDF_RaiseError (&pdf->error, ret, 0);
854
if ((ret = HPDF_List_Add (pdf->page_list, page)) != HPDF_OK) {
855
HPDF_RaiseError (&pdf->error, ret, 0);
859
pdf->cur_page = page;
861
if (pdf->compression_mode & HPDF_COMP_TEXT)
862
HPDF_Page_SetFilter (page, HPDF_STREAM_FILTER_FLATE_DECODE);
871
HPDF_Doc_AddPagesTo (HPDF_Doc pdf,
876
HPDF_PTRACE ((" HPDF_AddPagesTo\n"));
878
if (!HPDF_HasDoc (pdf))
881
if (!HPDF_Pages_Validate (parent)) {
882
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGES, 0);
886
/* check whether the page belong to the pdf */
887
if (pdf->mmgr != parent->mmgr) {
888
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGES, 0);
892
pages = HPDF_Pages_New (pdf->mmgr, parent, pdf->xref);
894
pdf->cur_pages = pages;
896
HPDF_CheckError (&pdf->error);
903
HPDF_EXPORT(HPDF_Page)
904
HPDF_InsertPage (HPDF_Doc pdf,
910
HPDF_PTRACE ((" HPDF_InsertPage\n"));
912
if (!HPDF_HasDoc (pdf))
915
if (!HPDF_Page_Validate (target)) {
916
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGE, 0);
920
/* check whether the page belong to the pdf */
921
if (pdf->mmgr != target->mmgr) {
922
HPDF_RaiseError (&pdf->error, HPDF_INVALID_PAGE, 0);
926
page = HPDF_Page_New (pdf->mmgr, pdf->xref);
928
HPDF_CheckError (&pdf->error);
932
if ((ret = HPDF_Page_InsertBefore (page, target)) != HPDF_OK) {
933
HPDF_RaiseError (&pdf->error, ret, 0);
937
if ((ret = HPDF_List_Insert (pdf->page_list, target, page)) != HPDF_OK) {
938
HPDF_RaiseError (&pdf->error, ret, 0);
942
if (pdf->compression_mode & HPDF_COMP_TEXT)
943
HPDF_Page_SetFilter (page, HPDF_STREAM_FILTER_FLATE_DECODE);
949
HPDF_EXPORT(HPDF_STATUS)
950
HPDF_SetErrorHandler (HPDF_Doc pdf,
951
HPDF_Error_Handler user_error_fn)
953
if (!HPDF_Doc_Validate (pdf))
954
return HPDF_INVALID_DOCUMENT;
956
pdf->error.error_fn = user_error_fn;
962
/*----- font handling -------------------------------------------------------*/
966
FreeFontDefList (HPDF_Doc pdf)
968
HPDF_List list = pdf->fontdef_list;
971
HPDF_PTRACE ((" HPDF_Doc_FreeFontDefList\n"));
973
for (i = 0; i < list->count; i++) {
974
HPDF_FontDef def = (HPDF_FontDef)HPDF_List_ItemAt (list, i);
976
HPDF_FontDef_Free (def);
979
HPDF_List_Free (list);
981
pdf->fontdef_list = NULL;
985
CleanupFontDefList (HPDF_Doc pdf)
987
HPDF_List list = pdf->fontdef_list;
990
HPDF_PTRACE ((" CleanupFontDefList\n"));
992
for (i = 0; i < list->count; i++) {
993
HPDF_FontDef def = (HPDF_FontDef)HPDF_List_ItemAt (list, i);
995
HPDF_FontDef_Cleanup (def);
1001
HPDF_Doc_FindFontDef (HPDF_Doc pdf,
1002
const char *font_name)
1004
HPDF_List list = pdf->fontdef_list;
1007
HPDF_PTRACE ((" HPDF_Doc_FindFontDef\n"));
1009
for (i = 0; i < list->count; i++) {
1010
HPDF_FontDef def = (HPDF_FontDef)HPDF_List_ItemAt (list, i);
1012
if (HPDF_StrCmp (font_name, def->base_font) == 0) {
1013
if (def->type == HPDF_FONTDEF_TYPE_UNINITIALIZED) {
1014
if (!def->init_fn ||
1015
def->init_fn (def) != HPDF_OK)
1028
HPDF_Doc_RegisterFontDef (HPDF_Doc pdf,
1029
HPDF_FontDef fontdef)
1033
HPDF_PTRACE ((" HPDF_Doc_RegisterFontDef\n"));
1036
return HPDF_SetError (&pdf->error, HPDF_INVALID_OBJECT, 0);
1038
if (HPDF_Doc_FindFontDef (pdf, fontdef->base_font) != NULL) {
1039
HPDF_FontDef_Free (fontdef);
1040
return HPDF_SetError (&pdf->error, HPDF_DUPLICATE_REGISTRATION, 0);
1043
if ((ret = HPDF_List_Add (pdf->fontdef_list, fontdef)) != HPDF_OK) {
1044
HPDF_FontDef_Free (fontdef);
1045
return HPDF_SetError (&pdf->error, ret, 0);
1054
HPDF_GetFontDef (HPDF_Doc pdf,
1055
const char *font_name)
1060
HPDF_PTRACE ((" HPDF_GetFontDef\n"));
1062
if (!HPDF_HasDoc (pdf))
1065
def = HPDF_Doc_FindFontDef (pdf, font_name);
1068
def = HPDF_Base14FontDef_New (pdf->mmgr, font_name);
1073
if ((ret = HPDF_List_Add (pdf->fontdef_list, def)) != HPDF_OK) {
1074
HPDF_FontDef_Free (def);
1075
HPDF_RaiseError (&pdf->error, ret, 0);
1084
/*----- encoder handling ----------------------------------------------------*/
1088
HPDF_Doc_FindEncoder (HPDF_Doc pdf,
1089
const char *encoding_name)
1091
HPDF_List list = pdf->encoder_list;
1094
HPDF_PTRACE ((" HPDF_Doc_FindEncoder\n"));
1096
for (i = 0; i < list->count; i++) {
1097
HPDF_Encoder encoder = (HPDF_Encoder)HPDF_List_ItemAt (list, i);
1099
if (HPDF_StrCmp (encoding_name, encoder->name) == 0) {
1101
/* if encoder is uninitialize, call init_fn() */
1102
if (encoder->type == HPDF_ENCODER_TYPE_UNINITIALIZED) {
1103
if (!encoder->init_fn ||
1104
encoder->init_fn (encoder) != HPDF_OK)
1118
HPDF_Doc_RegisterEncoder (HPDF_Doc pdf,
1119
HPDF_Encoder encoder)
1124
return HPDF_SetError (&pdf->error, HPDF_INVALID_OBJECT, 0);
1126
if (HPDF_Doc_FindEncoder (pdf, encoder->name) != NULL) {
1127
HPDF_Encoder_Free (encoder);
1128
return HPDF_SetError (&pdf->error, HPDF_DUPLICATE_REGISTRATION, 0);
1131
if ((ret = HPDF_List_Add (pdf->encoder_list, encoder)) != HPDF_OK) {
1132
HPDF_Encoder_Free (encoder);
1133
return HPDF_SetError (&pdf->error, ret, 0);
1140
HPDF_EXPORT(HPDF_Encoder)
1141
HPDF_GetEncoder (HPDF_Doc pdf,
1142
const char *encoding_name)
1144
HPDF_Encoder encoder;
1147
HPDF_PTRACE ((" HPDF_GetEncoder\n"));
1149
if (!HPDF_HasDoc (pdf))
1152
encoder = HPDF_Doc_FindEncoder (pdf, encoding_name);
1155
encoder = HPDF_BasicEncoder_New (pdf->mmgr, encoding_name);
1158
HPDF_CheckError (&pdf->error);
1162
if ((ret = HPDF_List_Add (pdf->encoder_list, encoder)) != HPDF_OK) {
1163
HPDF_Encoder_Free (encoder);
1164
HPDF_RaiseError (&pdf->error, ret, 0);
1173
HPDF_EXPORT(HPDF_Encoder)
1174
HPDF_GetCurrentEncoder (HPDF_Doc pdf)
1176
if (!HPDF_HasDoc (pdf))
1179
return pdf->cur_encoder;
1183
HPDF_EXPORT(HPDF_STATUS)
1184
HPDF_SetCurrentEncoder (HPDF_Doc pdf,
1185
const char *encoding_name)
1187
HPDF_Encoder encoder;
1189
if (!HPDF_HasDoc (pdf))
1190
return HPDF_GetError (pdf);
1192
encoder = HPDF_GetEncoder (pdf, encoding_name);
1193
pdf->cur_encoder = encoder;
1196
return HPDF_GetError (pdf);
1203
FreeEncoderList (HPDF_Doc pdf)
1205
HPDF_List list = pdf->encoder_list;
1208
HPDF_PTRACE ((" FreeEncoderList\n"));
1210
for (i = 0; i < list->count; i++) {
1211
HPDF_Encoder encoder = (HPDF_Encoder)HPDF_List_ItemAt (list, i);
1213
HPDF_Encoder_Free (encoder);
1216
HPDF_List_Free (list);
1218
pdf->encoder_list = NULL;
1222
/*----- font handling -------------------------------------------------------*/
1226
HPDF_Doc_FindFont (HPDF_Doc pdf,
1227
const char *font_name,
1228
const char *encoding_name)
1233
HPDF_PTRACE ((" HPDF_Doc_FindFont\n"));
1235
for (i = 0; i < pdf->font_mgr->count; i++) {
1238
font = (HPDF_Font)HPDF_List_ItemAt (pdf->font_mgr, i);
1239
attr = (HPDF_FontAttr) font->attr;
1241
if (HPDF_StrCmp (attr->fontdef->base_font, font_name) == 0 &&
1242
HPDF_StrCmp (attr->encoder->name, encoding_name) == 0)
1250
HPDF_EXPORT(HPDF_Font)
1251
HPDF_GetFont (HPDF_Doc pdf,
1252
const char *font_name,
1253
const char *encoding_name)
1255
HPDF_FontDef fontdef = NULL;
1256
HPDF_Encoder encoder = NULL;
1259
HPDF_PTRACE ((" HPDF_GetFont\n"));
1261
if (!HPDF_HasDoc (pdf))
1265
HPDF_RaiseError (&pdf->error, HPDF_INVALID_FONT_NAME, 0);
1269
/* if encoding-name is not specified, find default-encoding of fontdef
1271
if (!encoding_name) {
1272
fontdef = HPDF_GetFontDef (pdf, font_name);
1275
HPDF_Type1FontDefAttr attr = (HPDF_Type1FontDefAttr)fontdef->attr;
1277
if (fontdef->type == HPDF_FONTDEF_TYPE_TYPE1 &&
1278
HPDF_StrCmp (attr->encoding_scheme,
1279
HPDF_ENCODING_FONT_SPECIFIC) == 0)
1280
encoder = HPDF_GetEncoder (pdf, HPDF_ENCODING_FONT_SPECIFIC);
1282
encoder = HPDF_GetEncoder (pdf, HPDF_ENCODING_STANDARD);
1284
HPDF_CheckError (&pdf->error);
1288
font = HPDF_Doc_FindFont (pdf, font_name, encoder->name);
1290
font = HPDF_Doc_FindFont (pdf, font_name, encoding_name);
1297
fontdef = HPDF_GetFontDef (pdf, font_name);
1300
HPDF_CheckError (&pdf->error);
1306
encoder = HPDF_GetEncoder (pdf, encoding_name);
1312
switch (fontdef->type) {
1313
case HPDF_FONTDEF_TYPE_TYPE1:
1314
font = HPDF_Type1Font_New (pdf->mmgr, fontdef, encoder, pdf->xref);
1317
HPDF_List_Add (pdf->font_mgr, font);
1320
case HPDF_FONTDEF_TYPE_TRUETYPE:
1321
if (encoder->type == HPDF_ENCODER_TYPE_DOUBLE_BYTE)
1322
font = HPDF_Type0Font_New (pdf->mmgr, fontdef, encoder,
1325
font = HPDF_TTFont_New (pdf->mmgr, fontdef, encoder, pdf->xref);
1328
HPDF_List_Add (pdf->font_mgr, font);
1331
case HPDF_FONTDEF_TYPE_CID:
1332
font = HPDF_Type0Font_New (pdf->mmgr, fontdef, encoder, pdf->xref);
1335
HPDF_List_Add (pdf->font_mgr, font);
1339
HPDF_RaiseError (&pdf->error, HPDF_UNSUPPORTED_FONT_TYPE, 0);
1344
HPDF_CheckError (&pdf->error);
1346
if (font && (pdf->compression_mode & HPDF_COMP_METADATA))
1347
font->filter = HPDF_STREAM_FILTER_FLATE_DECODE;
1353
HPDF_EXPORT(const char*)
1354
HPDF_LoadType1FontFromFile (HPDF_Doc pdf,
1355
const char *afm_file_name,
1356
const char *data_file_name)
1359
HPDF_Stream pfm = NULL;
1362
HPDF_PTRACE ((" HPDF_LoadType1FontFromFile\n"));
1364
if (!HPDF_HasDoc (pdf))
1367
/* create file stream */
1368
afm = HPDF_FileReader_New (pdf->mmgr, afm_file_name);
1371
pfm = HPDF_FileReader_New (pdf->mmgr, data_file_name);
1373
if (HPDF_Stream_Validate (afm) &&
1374
(!data_file_name || HPDF_Stream_Validate (pfm))) {
1376
ret = LoadType1FontFromStream (pdf, afm, pfm);
1380
/* destroy file stream */
1382
HPDF_Stream_Free (afm);
1385
HPDF_Stream_Free (pfm);
1388
HPDF_CheckError (&pdf->error);
1395
LoadType1FontFromStream (HPDF_Doc pdf,
1396
HPDF_Stream afmdata,
1397
HPDF_Stream pfmdata)
1401
HPDF_PTRACE ((" HPDF_LoadType1FontFromStream\n"));
1403
if (!HPDF_HasDoc (pdf))
1406
def = HPDF_Type1FontDef_Load (pdf->mmgr, afmdata, pfmdata);
1408
HPDF_FontDef tmpdef = HPDF_Doc_FindFontDef (pdf, def->base_font);
1410
HPDF_FontDef_Free (def);
1411
HPDF_SetError (&pdf->error, HPDF_FONT_EXISTS, 0);
1415
if (HPDF_List_Add (pdf->fontdef_list, def) != HPDF_OK) {
1416
HPDF_FontDef_Free (def);
1419
return def->base_font;
1424
HPDF_EXPORT(HPDF_FontDef)
1425
HPDF_GetTTFontDefFromFile (HPDF_Doc pdf,
1426
const char *file_name,
1427
HPDF_BOOL embedding)
1429
HPDF_Stream font_data;
1432
HPDF_PTRACE ((" HPDF_GetTTFontDefFromFile\n"));
1434
/* create file stream */
1435
font_data = HPDF_FileReader_New (pdf->mmgr, file_name);
1437
if (HPDF_Stream_Validate (font_data)) {
1438
def = HPDF_TTFontDef_Load (pdf->mmgr, font_data, embedding);
1440
HPDF_CheckError (&pdf->error);
1447
HPDF_EXPORT(const char*)
1448
HPDF_LoadTTFontFromFile (HPDF_Doc pdf,
1449
const char *file_name,
1450
HPDF_BOOL embedding)
1452
HPDF_Stream font_data;
1455
HPDF_PTRACE ((" HPDF_LoadTTFontFromFile\n"));
1457
if (!HPDF_HasDoc (pdf))
1460
/* create file stream */
1461
font_data = HPDF_FileReader_New (pdf->mmgr, file_name);
1463
if (HPDF_Stream_Validate (font_data)) {
1464
ret = LoadTTFontFromStream (pdf, font_data, embedding, file_name);
1469
HPDF_CheckError (&pdf->error);
1476
LoadTTFontFromStream (HPDF_Doc pdf,
1477
HPDF_Stream font_data,
1478
HPDF_BOOL embedding,
1479
const char *file_name)
1483
HPDF_PTRACE ((" HPDF_LoadTTFontFromStream\n"));
1485
def = HPDF_TTFontDef_Load (pdf->mmgr, font_data, embedding);
1487
HPDF_FontDef tmpdef = HPDF_Doc_FindFontDef (pdf, def->base_font);
1489
HPDF_FontDef_Free (def);
1490
HPDF_SetError (&pdf->error, HPDF_FONT_EXISTS, 0);
1494
if (HPDF_List_Add (pdf->fontdef_list, def) != HPDF_OK) {
1495
HPDF_FontDef_Free (def);
1502
if (pdf->ttfont_tag[0] == 0) {
1503
HPDF_MemCpy (pdf->ttfont_tag, (HPDF_BYTE *)"HPDFAA", 6);
1507
for (i = 5; i >= 0; i--) {
1508
pdf->ttfont_tag[i] += 1;
1509
if (pdf->ttfont_tag[i] > 'Z')
1510
pdf->ttfont_tag[i] = 'A';
1516
HPDF_TTFontDef_SetTagName (def, (char *)pdf->ttfont_tag);
1519
return def->base_font;
1523
HPDF_EXPORT(const char*)
1524
HPDF_LoadTTFontFromFile2 (HPDF_Doc pdf,
1525
const char *file_name,
1527
HPDF_BOOL embedding)
1529
HPDF_Stream font_data;
1532
HPDF_PTRACE ((" HPDF_LoadTTFontFromFile2\n"));
1534
if (!HPDF_HasDoc (pdf))
1537
/* create file stream */
1538
font_data = HPDF_FileReader_New (pdf->mmgr, file_name);
1540
if (HPDF_Stream_Validate (font_data)) {
1541
ret = LoadTTFontFromStream2 (pdf, font_data, index, embedding, file_name);
1546
HPDF_CheckError (&pdf->error);
1553
LoadTTFontFromStream2 (HPDF_Doc pdf,
1554
HPDF_Stream font_data,
1556
HPDF_BOOL embedding,
1557
const char *file_name)
1561
HPDF_PTRACE ((" HPDF_LoadTTFontFromStream2\n"));
1563
def = HPDF_TTFontDef_Load2 (pdf->mmgr, font_data, index, embedding);
1565
HPDF_FontDef tmpdef = HPDF_Doc_FindFontDef (pdf, def->base_font);
1567
HPDF_FontDef_Free (def);
1568
HPDF_SetError (&pdf->error, HPDF_FONT_EXISTS, 0);
1572
if (HPDF_List_Add (pdf->fontdef_list, def) != HPDF_OK) {
1573
HPDF_FontDef_Free (def);
1580
if (pdf->ttfont_tag[0] == 0) {
1581
HPDF_MemCpy (pdf->ttfont_tag, (HPDF_BYTE *)"HPDFAA", 6);
1585
for (i = 5; i >= 0; i--) {
1586
pdf->ttfont_tag[i] += 1;
1587
if (pdf->ttfont_tag[i] > 'Z')
1588
pdf->ttfont_tag[i] = 'A';
1594
HPDF_TTFontDef_SetTagName (def, (char *)pdf->ttfont_tag);
1597
return def->base_font;
1601
HPDF_EXPORT(HPDF_Image)
1602
HPDF_LoadRawImageFromFile (HPDF_Doc pdf,
1603
const char *filename,
1606
HPDF_ColorSpace color_space)
1608
HPDF_Stream imagedata;
1611
HPDF_PTRACE ((" HPDF_LoadRawImageFromFile\n"));
1613
if (!HPDF_HasDoc (pdf))
1616
/* create file stream */
1617
imagedata = HPDF_FileReader_New (pdf->mmgr, filename);
1619
if (HPDF_Stream_Validate (imagedata))
1620
image = HPDF_Image_LoadRawImage (pdf->mmgr, imagedata, pdf->xref, width,
1621
height, color_space);
1625
/* destroy file stream */
1626
HPDF_Stream_Free (imagedata);
1629
HPDF_CheckError (&pdf->error);
1631
if (image && pdf->compression_mode & HPDF_COMP_IMAGE)
1632
image->filter = HPDF_STREAM_FILTER_FLATE_DECODE;
1638
HPDF_EXPORT(HPDF_Image)
1639
HPDF_LoadRawImageFromMem (HPDF_Doc pdf,
1640
const HPDF_BYTE *buf,
1643
HPDF_ColorSpace color_space,
1644
HPDF_UINT bits_per_component)
1648
HPDF_PTRACE ((" HPDF_LoadRawImageFromMem\n"));
1650
if (!HPDF_HasDoc (pdf))
1653
image = HPDF_Image_LoadRawImageFromMem (pdf->mmgr, buf, pdf->xref, width,
1654
height, color_space, bits_per_component);
1657
HPDF_CheckError (&pdf->error);
1659
if (image && pdf->compression_mode & HPDF_COMP_IMAGE)
1660
image->filter = HPDF_STREAM_FILTER_FLATE_DECODE;
1666
HPDF_EXPORT(HPDF_Image)
1667
HPDF_LoadJpegImageFromFile (HPDF_Doc pdf,
1668
const char *filename)
1670
HPDF_Stream imagedata;
1673
HPDF_PTRACE ((" HPDF_LoadJpegImageFromFile\n"));
1675
if (!HPDF_HasDoc (pdf))
1678
/* create file stream */
1679
imagedata = HPDF_FileReader_New (pdf->mmgr, filename);
1681
if (HPDF_Stream_Validate (imagedata))
1682
image = HPDF_Image_LoadJpegImage (pdf->mmgr, imagedata, pdf->xref);
1686
/* destroy file stream */
1687
HPDF_Stream_Free (imagedata);
1690
HPDF_CheckError (&pdf->error);
1696
/*----- Catalog ------------------------------------------------------------*/
1698
HPDF_EXPORT(HPDF_PageLayout)
1699
HPDF_GetPageLayout (HPDF_Doc pdf)
1701
HPDF_PTRACE ((" HPDF_GetPageLayout\n"));
1703
if (!HPDF_HasDoc (pdf))
1704
return HPDF_PAGE_LAYOUT_SINGLE;
1706
return HPDF_Catalog_GetPageLayout (pdf->catalog);
1710
HPDF_EXPORT(HPDF_STATUS)
1711
HPDF_SetPageLayout (HPDF_Doc pdf,
1712
HPDF_PageLayout layout)
1716
HPDF_PTRACE ((" HPDF_GetPageLayout\n"));
1718
if (!HPDF_HasDoc (pdf))
1719
return HPDF_INVALID_DOCUMENT;
1721
if (layout < 0 || layout >= HPDF_PAGE_LAYOUT_EOF)
1722
return HPDF_RaiseError (&pdf->error, HPDF_PAGE_LAYOUT_OUT_OF_RANGE,
1723
(HPDF_STATUS)layout);
1725
ret = HPDF_Catalog_SetPageLayout (pdf->catalog, layout);
1727
HPDF_CheckError (&pdf->error);
1732
HPDF_EXPORT(HPDF_PageMode)
1733
HPDF_GetPageMode (HPDF_Doc pdf)
1735
HPDF_PTRACE ((" HPDF_GetPageMode\n"));
1737
if (!HPDF_HasDoc (pdf))
1738
return HPDF_PAGE_MODE_USE_NONE;
1740
return HPDF_Catalog_GetPageMode (pdf->catalog);
1744
HPDF_EXPORT(HPDF_STATUS)
1745
HPDF_SetPageMode (HPDF_Doc pdf,
1750
HPDF_PTRACE ((" HPDF_GetPageMode\n"));
1752
if (!HPDF_HasDoc (pdf))
1753
return HPDF_INVALID_DOCUMENT;
1755
if (mode < 0 || mode >= HPDF_PAGE_MODE_EOF)
1756
return HPDF_RaiseError (&pdf->error, HPDF_PAGE_MODE_OUT_OF_RANGE,
1759
ret = HPDF_Catalog_SetPageMode (pdf->catalog, mode);
1761
return HPDF_CheckError (&pdf->error);
1767
HPDF_EXPORT(HPDF_STATUS)
1768
HPDF_SetOpenAction (HPDF_Doc pdf,
1769
HPDF_Destination open_action)
1773
HPDF_PTRACE ((" HPDF_SetOpenAction\n"));
1775
if (!HPDF_HasDoc (pdf))
1776
return HPDF_INVALID_DOCUMENT;
1778
if (open_action && !HPDF_Destination_Validate (open_action))
1779
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_DESTINATION, 0);
1781
ret = HPDF_Catalog_SetOpenAction (pdf->catalog, open_action);
1783
return HPDF_CheckError (&pdf->error);
1789
HPDF_EXPORT(HPDF_UINT)
1790
HPDF_GetViewerPreference (HPDF_Doc pdf)
1792
HPDF_PTRACE ((" HPDF_Catalog_GetViewerPreference\n"));
1794
if (!HPDF_HasDoc (pdf))
1797
return HPDF_Catalog_GetViewerPreference (pdf->catalog);
1801
HPDF_EXPORT(HPDF_STATUS)
1802
HPDF_SetViewerPreference (HPDF_Doc pdf,
1807
HPDF_PTRACE ((" HPDF_Catalog_SetViewerPreference\n"));
1809
if (!HPDF_HasDoc (pdf))
1810
return HPDF_INVALID_DOCUMENT;
1812
ret = HPDF_Catalog_SetViewerPreference (pdf->catalog, value);
1814
return HPDF_CheckError (&pdf->error);
1820
HPDF_EXPORT(HPDF_STATUS)
1821
HPDF_AddPageLabel (HPDF_Doc pdf,
1823
HPDF_PageNumStyle style,
1824
HPDF_UINT first_page,
1827
HPDF_Dict page_label;
1830
HPDF_PTRACE ((" HPDF_AddPageLabel\n"));
1832
if (!HPDF_HasDoc (pdf))
1833
return HPDF_INVALID_DOCUMENT;
1835
page_label = HPDF_PageLabel_New (pdf, style, first_page, prefix);
1838
return HPDF_CheckError (&pdf->error);
1840
if (style < 0 || style >= HPDF_PAGE_NUM_STYLE_EOF)
1841
return HPDF_RaiseError (&pdf->error, HPDF_PAGE_NUM_STYLE_OUT_OF_RANGE,
1842
(HPDF_STATUS)style);
1844
ret = HPDF_Catalog_AddPageLabel (pdf->catalog, page_num, page_label);
1846
return HPDF_CheckError (&pdf->error);
1852
/*----- Info ---------------------------------------------------------------*/
1855
GetInfo (HPDF_Doc pdf)
1857
if (!HPDF_HasDoc (pdf))
1861
pdf->info = HPDF_Dict_New (pdf->mmgr);
1863
if (!pdf->info || HPDF_Xref_Add (pdf->xref, pdf->info) != HPDF_OK)
1871
HPDF_EXPORT(HPDF_STATUS)
1872
HPDF_SetInfoAttr (HPDF_Doc pdf,
1877
HPDF_Dict info = GetInfo (pdf);
1879
HPDF_PTRACE((" HPDF_SetInfoAttr\n"));
1882
return HPDF_CheckError (&pdf->error);
1884
ret = HPDF_Info_SetInfoAttr (info, type, value, pdf->cur_encoder);
1886
return HPDF_CheckError (&pdf->error);
1892
HPDF_EXPORT(const char*)
1893
HPDF_GetInfoAttr (HPDF_Doc pdf,
1896
const char *ret = NULL;
1897
HPDF_Dict info = GetInfo (pdf);
1899
HPDF_PTRACE((" HPDF_GetInfoAttr\n"));
1902
ret = HPDF_Info_GetInfoAttr (info, type);
1904
HPDF_CheckError (&pdf->error);
1910
HPDF_EXPORT(HPDF_STATUS)
1911
HPDF_SetInfoDateAttr (HPDF_Doc pdf,
1916
HPDF_Dict info = GetInfo (pdf);
1918
HPDF_PTRACE((" HPDF_SetInfoDateAttr\n"));
1921
return HPDF_CheckError (&pdf->error);
1923
ret = HPDF_Info_SetInfoDateAttr (info, type, value);
1925
return HPDF_CheckError (&pdf->error);
1931
HPDF_EXPORT(HPDF_Outline)
1932
HPDF_CreateOutline (HPDF_Doc pdf,
1933
HPDF_Outline parent,
1935
HPDF_Encoder encoder)
1937
HPDF_Outline outline;
1939
if (!HPDF_HasDoc (pdf))
1943
if (pdf->outlines) {
1944
parent = pdf->outlines;
1946
pdf->outlines = HPDF_OutlineRoot_New (pdf->mmgr, pdf->xref);
1948
if (pdf->outlines) {
1949
HPDF_STATUS ret = HPDF_Dict_Add (pdf->catalog, "Outlines",
1951
if (ret != HPDF_OK) {
1952
HPDF_CheckError (&pdf->error);
1953
pdf->outlines = NULL;
1957
parent = pdf->outlines;
1959
HPDF_CheckError (&pdf->error);
1965
if (!HPDF_Outline_Validate (parent) || pdf->mmgr != parent->mmgr) {
1966
HPDF_RaiseError (&pdf->error, HPDF_INVALID_OUTLINE, 0);
1970
outline = HPDF_Outline_New (pdf->mmgr, parent, title, encoder, pdf->xref);
1972
HPDF_CheckError (&pdf->error);
1978
HPDF_EXPORT(HPDF_ExtGState)
1979
HPDF_CreateExtGState (HPDF_Doc pdf)
1981
HPDF_ExtGState ext_gstate;
1983
if (!HPDF_HasDoc (pdf))
1986
pdf->pdf_version = HPDF_VER_14;
1988
ext_gstate = HPDF_ExtGState_New (pdf->mmgr, pdf->xref);
1990
HPDF_CheckError (&pdf->error);
1996
HPDF_EXPORT(HPDF_STATUS)
1997
HPDF_SetCompressionMode (HPDF_Doc pdf,
2000
if (!HPDF_Doc_Validate (pdf))
2001
return HPDF_INVALID_DOCUMENT;
2003
if (mode != (mode & HPDF_COMP_MASK))
2004
return HPDF_RaiseError (&pdf->error, HPDF_INVALID_COMPRESSION_MODE, 0);
2007
pdf->compression_mode = mode;
2011
#else /* HPDF_NOZLIB */
2013
return HPDF_INVALID_COMPRESSION_MODE;
2015
#endif /* HPDF_NOZLIB */
2019
HPDF_EXPORT(HPDF_STATUS)
2020
HPDF_GetError (HPDF_Doc pdf)
2022
if (!HPDF_Doc_Validate (pdf))
2023
return HPDF_INVALID_DOCUMENT;
2025
return HPDF_Error_GetCode (&pdf->error);
2029
HPDF_EXPORT(HPDF_STATUS)
2030
HPDF_GetErrorDetail (HPDF_Doc pdf)
2032
if (!HPDF_Doc_Validate (pdf))
2033
return HPDF_INVALID_DOCUMENT;
2035
return HPDF_Error_GetDetailCode (&pdf->error);
2040
HPDF_ResetError (HPDF_Doc pdf)
2042
if (!HPDF_Doc_Validate (pdf))
2045
HPDF_Error_Reset (&pdf->error);