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.
Files changed (101) hide show
  1. data/History +57 -0
  2. data/License +25 -0
  3. data/README +165 -0
  4. data/examples/arc_demo.rb +82 -0
  5. data/examples/demo.rb +92 -0
  6. data/examples/encryption.rb +41 -0
  7. data/examples/ext_gstater_demo.rb +171 -0
  8. data/examples/font_demo.rb +67 -0
  9. data/examples/jpfont_demo.rb +122 -0
  10. data/examples/line_demo.rb +301 -0
  11. data/examples/slide_show_demo.rb +139 -0
  12. data/examples/text_demo2.rb +189 -0
  13. data/examples/ttfont_demo.rb +106 -0
  14. data/ext/extconf.rb +6 -0
  15. data/ext/hpdf.c +3779 -0
  16. data/ext/hpdf_annotation.c +415 -0
  17. data/ext/hpdf_array.c +344 -0
  18. data/ext/hpdf_binary.c +117 -0
  19. data/ext/hpdf_boolean.c +47 -0
  20. data/ext/hpdf_catalog.c +354 -0
  21. data/ext/hpdf_destination.c +339 -0
  22. data/ext/hpdf_dict.c +488 -0
  23. data/ext/hpdf_doc.c +2020 -0
  24. data/ext/hpdf_doc_png.c +137 -0
  25. data/ext/hpdf_encoder.c +2991 -0
  26. data/ext/hpdf_encoder_cns.c +36359 -0
  27. data/ext/hpdf_encoder_cnt.c +15307 -0
  28. data/ext/hpdf_encoder_jp.c +16125 -0
  29. data/ext/hpdf_encoder_kr.c +27978 -0
  30. data/ext/hpdf_encrypt.c +632 -0
  31. data/ext/hpdf_encryptdict.c +240 -0
  32. data/ext/hpdf_error.c +114 -0
  33. data/ext/hpdf_ext_gstate.c +150 -0
  34. data/ext/hpdf_font.c +229 -0
  35. data/ext/hpdf_font_cid.c +1030 -0
  36. data/ext/hpdf_font_tt.c +406 -0
  37. data/ext/hpdf_font_type1.c +391 -0
  38. data/ext/hpdf_fontdef.c +56 -0
  39. data/ext/hpdf_fontdef_base14.c +4506 -0
  40. data/ext/hpdf_fontdef_cid.c +194 -0
  41. data/ext/hpdf_fontdef_cns.c +471 -0
  42. data/ext/hpdf_fontdef_cnt.c +250 -0
  43. data/ext/hpdf_fontdef_jp.c +1904 -0
  44. data/ext/hpdf_fontdef_kr.c +1572 -0
  45. data/ext/hpdf_fontdef_tt.c +2230 -0
  46. data/ext/hpdf_fontdef_type1.c +524 -0
  47. data/ext/hpdf_gstate.c +119 -0
  48. data/ext/hpdf_image.c +568 -0
  49. data/ext/hpdf_image_png.c +424 -0
  50. data/ext/hpdf_info.c +164 -0
  51. data/ext/hpdf_list.c +333 -0
  52. data/ext/hpdf_mmgr.c +243 -0
  53. data/ext/hpdf_name.c +71 -0
  54. data/ext/hpdf_null.c +31 -0
  55. data/ext/hpdf_number.c +49 -0
  56. data/ext/hpdf_objects.c +172 -0
  57. data/ext/hpdf_outline.c +329 -0
  58. data/ext/hpdf_page_label.c +74 -0
  59. data/ext/hpdf_page_operator.c +2764 -0
  60. data/ext/hpdf_pages.c +1508 -0
  61. data/ext/hpdf_real.c +61 -0
  62. data/ext/hpdf_streams.c +1435 -0
  63. data/ext/hpdf_string.c +189 -0
  64. data/ext/hpdf_utils.c +438 -0
  65. data/ext/hpdf_xref.c +348 -0
  66. data/ext/include/hpdf.h +1227 -0
  67. data/ext/include/hpdf_annotation.h +74 -0
  68. data/ext/include/hpdf_catalog.h +81 -0
  69. data/ext/include/hpdf_conf.h +76 -0
  70. data/ext/include/hpdf_consts.h +549 -0
  71. data/ext/include/hpdf_destination.h +41 -0
  72. data/ext/include/hpdf_doc.h +159 -0
  73. data/ext/include/hpdf_encoder.h +311 -0
  74. data/ext/include/hpdf_encrypt.h +156 -0
  75. data/ext/include/hpdf_encryptdict.h +66 -0
  76. data/ext/include/hpdf_error.h +201 -0
  77. data/ext/include/hpdf_ext_gstate.h +38 -0
  78. data/ext/include/hpdf_font.h +112 -0
  79. data/ext/include/hpdf_fontdef.h +403 -0
  80. data/ext/include/hpdf_gstate.h +80 -0
  81. data/ext/include/hpdf_image.h +72 -0
  82. data/ext/include/hpdf_info.h +48 -0
  83. data/ext/include/hpdf_list.h +85 -0
  84. data/ext/include/hpdf_mmgr.h +82 -0
  85. data/ext/include/hpdf_objects.h +587 -0
  86. data/ext/include/hpdf_outline.h +74 -0
  87. data/ext/include/hpdf_page_label.h +35 -0
  88. data/ext/include/hpdf_pages.h +128 -0
  89. data/ext/include/hpdf_streams.h +276 -0
  90. data/ext/include/hpdf_types.h +488 -0
  91. data/ext/include/hpdf_utils.h +161 -0
  92. data/tests/arc_demo.rb +82 -0
  93. data/tests/demo.rb +91 -0
  94. data/tests/encryption.rb +41 -0
  95. data/tests/ext_gstater_demo.rb +171 -0
  96. data/tests/font_demo.rb +67 -0
  97. data/tests/line_demo.rb +301 -0
  98. data/tests/slide_show_demo.rb +139 -0
  99. data/tests/test_all_examples.rb +31 -0
  100. data/tests/text_demo2.rb +189 -0
  101. metadata +147 -0
@@ -0,0 +1,1508 @@
1
+ /*
2
+ * << Haru Free PDF Library 2.0.3 >> -- hpdf_pages.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
+ #include "hpdf_conf.h"
16
+ #include "hpdf_utils.h"
17
+ #include "hpdf.h"
18
+ #include "hpdf_annotation.h"
19
+ #include "hpdf_destination.h"
20
+
21
+ /*----------------------------------------------------------------------------*/
22
+
23
+ typedef struct _HPDF_PageSizeValue {
24
+ HPDF_REAL x;
25
+ HPDF_REAL y;
26
+ } HPDF_PageSizeValue;
27
+
28
+ static HPDF_PageSizeValue HPDF_PREDEFINED_PAGE_SIZES[] = {
29
+ {612, 792}, /* HPDF_PAGE_SIZE_LETTER */
30
+ {612, 1008}, /* HPDF_PAGE_SIZE_LEGAL */
31
+ {841.89, 1199.551}, /* HPDF_PAGE_SIZE_A3 */
32
+ {595.276, 841.89}, /* HPDF_PAGE_SIZE_A4 */
33
+ {419.528, 595.276}, /* HPDF_PAGE_SIZE_A5 */
34
+ {708.661, 1000.63}, /* HPDF_PAGE_SIZE_B4 */
35
+ {498.898, 708.661}, /* HPDF_PAGE_SIZE_B5 */
36
+ {522, 756}, /* HPDF_PAGE_SIZE_EXECUTIVE */
37
+ {288, 432}, /* HPDF_PAGE_SIZE_US4x6 */
38
+ {288, 576}, /* HPDF_PAGE_SIZE_US4x8 */
39
+ {360, 504}, /* HPDF_PAGE_SIZE_US5x7 */
40
+ {297, 684} /* HPDF_PAGE_SIZE_COMM10 */
41
+ };
42
+
43
+
44
+ static const HPDF_RGBColor DEF_RGB_COLOR = {0, 0, 0};
45
+
46
+ static const HPDF_CMYKColor DEF_CMYK_COLOR = {0, 0, 0, 0};
47
+
48
+
49
+ static HPDF_STATUS
50
+ Pages_BeforeWrite (HPDF_Dict obj);
51
+
52
+
53
+ static HPDF_STATUS
54
+ Page_BeforeWrite (HPDF_Dict obj);
55
+
56
+
57
+ static void
58
+ Page_OnFree (HPDF_Dict obj);
59
+
60
+
61
+ static HPDF_STATUS
62
+ AddResource (HPDF_Page page);
63
+
64
+
65
+ static HPDF_STATUS
66
+ AddAnnotation (HPDF_Page page,
67
+ HPDF_Annotation annot);
68
+
69
+
70
+
71
+ static HPDF_UINT
72
+ GetPageCount (HPDF_Dict pages);
73
+
74
+ static const char *HPDF_INHERITABLE_ENTRIES[5] = {
75
+ "Resources",
76
+ "MediaBox",
77
+ "CropBox",
78
+ "Rotate",
79
+ NULL
80
+ };
81
+
82
+
83
+ /*----------------------------------------------------------------------------*/
84
+ /*----- HPDF_Pages -----------------------------------------------------------*/
85
+
86
+ HPDF_Pages
87
+ HPDF_Pages_New (HPDF_MMgr mmgr,
88
+ HPDF_Pages parent,
89
+ HPDF_Xref xref)
90
+ {
91
+ HPDF_STATUS ret = HPDF_OK;
92
+ HPDF_Pages pages;
93
+
94
+
95
+ HPDF_PTRACE((" HPDF_Pages_New\n"));
96
+
97
+ pages = HPDF_Dict_New (mmgr);
98
+ if (!pages)
99
+ return NULL;
100
+
101
+ pages->header.obj_class |= HPDF_OSUBCLASS_PAGES;
102
+ pages->before_write_fn = Pages_BeforeWrite;
103
+
104
+ if (HPDF_Xref_Add (xref, pages) != HPDF_OK)
105
+ return NULL;
106
+
107
+ /* add requiered elements */
108
+ ret += HPDF_Dict_AddName (pages, "Type", "Pages");
109
+ ret += HPDF_Dict_Add (pages, "Kids", HPDF_Array_New (pages->mmgr));
110
+ ret += HPDF_Dict_Add (pages, "Count", HPDF_Number_New (pages->mmgr, 0));
111
+
112
+ if (ret == HPDF_OK && parent)
113
+ ret += HPDF_Pages_AddKids (parent, pages);
114
+
115
+ if (ret != HPDF_OK)
116
+ return NULL;
117
+
118
+ return pages;
119
+ }
120
+
121
+
122
+ HPDF_STATUS
123
+ HPDF_Pages_AddKids (HPDF_Pages parent,
124
+ HPDF_Dict kid)
125
+ {
126
+ HPDF_Array kids;
127
+ HPDF_STATUS ret;
128
+
129
+ HPDF_PTRACE((" HPDF_Pages_AddKids\n"));
130
+
131
+ if (HPDF_Dict_GetItem (kid, "Parent", HPDF_OCLASS_DICT))
132
+ return HPDF_SetError (parent->error, HPDF_PAGE_CANNOT_SET_PARENT, 0);
133
+
134
+ if ((ret = HPDF_Dict_Add (kid, "Parent", parent)) != HPDF_OK)
135
+ return ret;
136
+
137
+ kids = (HPDF_Array )HPDF_Dict_GetItem (parent, "Kids", HPDF_OCLASS_ARRAY);
138
+ if (!kids)
139
+ return HPDF_SetError (parent->error, HPDF_PAGES_MISSING_KIDS_ENTRY, 0);
140
+
141
+ if (kid->header.obj_class == (HPDF_OCLASS_DICT | HPDF_OSUBCLASS_PAGE)) {
142
+ HPDF_PageAttr attr = (HPDF_PageAttr)kid->attr;
143
+
144
+ attr->parent = parent;
145
+ }
146
+
147
+ return HPDF_Array_Add (kids, kid);
148
+ }
149
+
150
+
151
+ HPDF_STATUS
152
+ HPDF_Page_InsertBefore (HPDF_Page page,
153
+ HPDF_Page target)
154
+ {
155
+ HPDF_Page parent;
156
+ HPDF_Array kids;
157
+ HPDF_STATUS ret;
158
+ HPDF_PageAttr attr;
159
+
160
+ HPDF_PTRACE((" HPDF_Page_InsertBefore\n"));
161
+
162
+ attr = (HPDF_PageAttr )target->attr;
163
+ parent = attr->parent;
164
+
165
+ if (!parent)
166
+ return HPDF_SetError (parent->error, HPDF_PAGE_CANNOT_SET_PARENT, 0);
167
+
168
+ if (HPDF_Dict_GetItem (page, "Parent", HPDF_OCLASS_DICT))
169
+ return HPDF_SetError (parent->error, HPDF_PAGE_CANNOT_SET_PARENT, 0);
170
+
171
+ if ((ret = HPDF_Dict_Add (page, "Parent", parent)) != HPDF_OK)
172
+ return ret;
173
+
174
+ kids = (HPDF_Array )HPDF_Dict_GetItem (parent, "Kids", HPDF_OCLASS_ARRAY);
175
+ if (!kids)
176
+ return HPDF_SetError (parent->error, HPDF_PAGES_MISSING_KIDS_ENTRY, 0);
177
+
178
+ attr = (HPDF_PageAttr)page->attr;
179
+ attr->parent = parent;
180
+
181
+ return HPDF_Array_Insert (kids, target, page);
182
+ }
183
+
184
+
185
+ HPDF_STATUS
186
+ Pages_BeforeWrite (HPDF_Dict obj)
187
+ {
188
+ HPDF_Array kids = (HPDF_Array )HPDF_Dict_GetItem (obj, "Kids",
189
+ HPDF_OCLASS_ARRAY);
190
+ HPDF_Number count = (HPDF_Number)HPDF_Dict_GetItem (obj, "Count",
191
+ HPDF_OCLASS_NUMBER);
192
+ HPDF_STATUS ret;
193
+
194
+ HPDF_PTRACE((" HPDF_Pages_BeforeWrite\n"));
195
+
196
+ if (!kids)
197
+ return HPDF_SetError (obj->error, HPDF_PAGES_MISSING_KIDS_ENTRY, 0);
198
+
199
+ if (count)
200
+ count->value = GetPageCount (obj);
201
+ else {
202
+ count = HPDF_Number_New (obj->mmgr, GetPageCount (obj));
203
+ if (!count)
204
+ return HPDF_Error_GetCode (obj->error);
205
+
206
+ if ((ret = HPDF_Dict_Add (obj, "Count", count)) != HPDF_OK)
207
+ return ret;
208
+ }
209
+
210
+ return HPDF_OK;
211
+ }
212
+
213
+
214
+ static HPDF_STATUS
215
+ Page_BeforeWrite (HPDF_Dict obj)
216
+ {
217
+ HPDF_STATUS ret;
218
+ HPDF_Page page = (HPDF_Page)obj;
219
+ HPDF_PageAttr attr = (HPDF_PageAttr)obj->attr;
220
+
221
+ HPDF_PTRACE((" HPDF_Page_BeforeWrite\n"));
222
+
223
+ if (attr->gmode == HPDF_GMODE_PATH_OBJECT) {
224
+ HPDF_PTRACE((" HPDF_Page_BeforeWrite warning path object is not"
225
+ " end\n"));
226
+
227
+ if ((ret = HPDF_Page_EndPath (page)) != HPDF_OK)
228
+ return ret;
229
+ }
230
+
231
+ if (attr->gmode == HPDF_GMODE_TEXT_OBJECT) {
232
+ HPDF_PTRACE((" HPDF_Page_BeforeWrite warning text block is not end\n"));
233
+
234
+ if ((ret = HPDF_Page_EndText (page)) != HPDF_OK)
235
+ return ret;
236
+ }
237
+
238
+ if (attr->gstate)
239
+ while (attr->gstate->prev) {
240
+ if ((ret = HPDF_Page_GRestore (page)) != HPDF_OK)
241
+ return ret;
242
+ }
243
+
244
+ return HPDF_OK;
245
+ }
246
+
247
+
248
+ static HPDF_UINT
249
+ GetPageCount (HPDF_Dict pages)
250
+ {
251
+ HPDF_UINT i;
252
+ HPDF_UINT count = 0;
253
+ HPDF_Array kids = (HPDF_Array)HPDF_Dict_GetItem (pages, "Kids",
254
+ HPDF_OCLASS_ARRAY);
255
+
256
+ HPDF_PTRACE((" GetPageCount\n"));
257
+
258
+ if (!kids)
259
+ return 0;
260
+
261
+ for (i = 0; i < kids->list->count; i++) {
262
+ void *obj = HPDF_Array_GetItem (kids, i, HPDF_OCLASS_DICT);
263
+ HPDF_Obj_Header *header = (HPDF_Obj_Header *)obj;
264
+
265
+ if (header->obj_class == (HPDF_OCLASS_DICT | HPDF_OSUBCLASS_PAGES))
266
+ count += GetPageCount ((HPDF_Dict)obj);
267
+ else if (header->obj_class == (HPDF_OCLASS_DICT | HPDF_OSUBCLASS_PAGE))
268
+ count += 1;
269
+ }
270
+
271
+ return count;
272
+ }
273
+
274
+
275
+ HPDF_BOOL
276
+ HPDF_Pages_Validate (HPDF_Pages pages)
277
+ {
278
+ HPDF_Obj_Header *header = (HPDF_Obj_Header *)pages;
279
+
280
+ HPDF_PTRACE((" HPDF_Pages_Validate\n"));
281
+
282
+ if (!pages || header->obj_class != (HPDF_OCLASS_DICT |
283
+ HPDF_OSUBCLASS_PAGES))
284
+ return HPDF_FALSE;
285
+
286
+ return HPDF_TRUE;
287
+ }
288
+
289
+
290
+ /*----------------------------------------------------------------------------*/
291
+ /*----- HPDF_Page ------------------------------------------------------------*/
292
+
293
+
294
+ HPDF_Page
295
+ HPDF_Page_New (HPDF_MMgr mmgr,
296
+ HPDF_Xref xref)
297
+ {
298
+ HPDF_STATUS ret;
299
+ HPDF_PageAttr attr;
300
+ HPDF_Page page;
301
+
302
+ HPDF_PTRACE((" HPDF_Page_New\n"));
303
+
304
+ page = HPDF_Dict_New (mmgr);
305
+ if (!page)
306
+ return NULL;
307
+
308
+ page->header.obj_class |= HPDF_OSUBCLASS_PAGE;
309
+ page->free_fn = Page_OnFree;
310
+ page->before_write_fn = Page_BeforeWrite;
311
+
312
+ attr = HPDF_GetMem (page->mmgr, sizeof(HPDF_PageAttr_Rec));
313
+ if (!attr) {
314
+ HPDF_Dict_Free (page);
315
+ return NULL;
316
+ }
317
+
318
+ page->attr = attr;
319
+ HPDF_MemSet (attr, 0, sizeof(HPDF_PageAttr_Rec));
320
+ attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION;
321
+ attr->cur_pos = HPDF_ToPoint (0, 0);
322
+ attr->text_pos = HPDF_ToPoint (0, 0);
323
+
324
+ ret = HPDF_Xref_Add (xref, page);
325
+ if (ret != HPDF_OK)
326
+ return NULL;
327
+
328
+ attr->gstate = HPDF_GState_New (page->mmgr, NULL);
329
+ attr->contents = HPDF_DictStream_New (page->mmgr, xref);
330
+
331
+ if (!attr->gstate || !attr->contents)
332
+ return NULL;
333
+
334
+ attr->stream = attr->contents->stream;
335
+ attr->xref = xref;
336
+
337
+ /* add requiered elements */
338
+ ret += HPDF_Dict_AddName (page, "Type", "Page");
339
+ ret += HPDF_Dict_Add (page, "MediaBox", HPDF_Box_Array_New (page->mmgr,
340
+ HPDF_ToBox (0, 0, HPDF_DEF_PAGE_WIDTH, HPDF_DEF_PAGE_HEIGHT)));
341
+ ret += HPDF_Dict_Add (page, "Contents", attr->contents);
342
+
343
+ ret += AddResource (page);
344
+
345
+ if (ret != HPDF_OK)
346
+ return NULL;
347
+
348
+ return page;
349
+ }
350
+
351
+
352
+
353
+
354
+ static void
355
+ Page_OnFree (HPDF_Dict obj)
356
+ {
357
+ HPDF_PageAttr attr = (HPDF_PageAttr)obj->attr;
358
+
359
+ HPDF_PTRACE((" HPDF_Page_OnFree\n"));
360
+
361
+ if (attr) {
362
+ if (attr->gstate)
363
+ HPDF_GState_Free (obj->mmgr, attr->gstate);
364
+
365
+ HPDF_FreeMem (obj->mmgr, attr);
366
+ }
367
+ }
368
+
369
+
370
+ HPDF_STATUS
371
+ HPDF_Page_CheckState (HPDF_Page page,
372
+ HPDF_UINT mode)
373
+ {
374
+ if (!page)
375
+ return HPDF_INVALID_OBJECT;
376
+
377
+ if (page->header.obj_class != (HPDF_OSUBCLASS_PAGE | HPDF_OCLASS_DICT))
378
+ return HPDF_INVALID_PAGE;
379
+
380
+ if (!(((HPDF_PageAttr)page->attr)->gmode & mode))
381
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_GMODE, 0);
382
+
383
+ return HPDF_OK;
384
+ }
385
+
386
+
387
+ void*
388
+ HPDF_Page_GetInheritableItem (HPDF_Page page,
389
+ const char *key,
390
+ HPDF_UINT16 obj_class)
391
+ {
392
+ HPDF_BOOL chk = HPDF_FALSE;
393
+ HPDF_INT i = 0;
394
+ void * obj;
395
+
396
+ HPDF_PTRACE((" HPDF_Page_GetInheritableItem\n"));
397
+
398
+ /* check whether the specified key is valid */
399
+ while (HPDF_INHERITABLE_ENTRIES[i]) {
400
+ if (HPDF_StrCmp (key, HPDF_INHERITABLE_ENTRIES[i]) == 0) {
401
+ chk = HPDF_TRUE;
402
+ break;
403
+ }
404
+ i++;
405
+ }
406
+
407
+ /* the key is not inheritable */
408
+ if (chk != HPDF_TRUE) {
409
+ HPDF_SetError (page->error, HPDF_INVALID_PARAMETER, 0);
410
+ return NULL;
411
+ }
412
+
413
+ obj = HPDF_Dict_GetItem (page, key, obj_class);
414
+
415
+ /* if resources of the object is NULL, search resources of parent
416
+ * pages recursivly
417
+ */
418
+ if (!obj) {
419
+ HPDF_Pages pages = HPDF_Dict_GetItem (page, "Parent", HPDF_OCLASS_DICT);
420
+ while (pages) {
421
+ obj = HPDF_Dict_GetItem (page, key, obj_class);
422
+
423
+ if (obj)
424
+ break;
425
+
426
+ pages = HPDF_Dict_GetItem (pages, "Parent", HPDF_OCLASS_DICT);
427
+ }
428
+ }
429
+
430
+ return obj;
431
+ }
432
+
433
+
434
+ HPDF_STATUS
435
+ AddResource (HPDF_Page page)
436
+ {
437
+ HPDF_STATUS ret = HPDF_OK;
438
+ HPDF_Dict resource;
439
+ HPDF_Array procset;
440
+
441
+ HPDF_PTRACE((" HPDF_Page_AddResource\n"));
442
+
443
+ resource = HPDF_Dict_New (page->mmgr);
444
+ if (!resource)
445
+ return HPDF_Error_GetCode (page->error);
446
+
447
+ /* althoth ProcSet-entry is obsolete, add it to resouce for
448
+ * compatibility
449
+ */
450
+
451
+ ret += HPDF_Dict_Add (page, "Resources", resource);
452
+
453
+ procset = HPDF_Array_New (page->mmgr);
454
+ if (!procset)
455
+ return HPDF_Error_GetCode (page->error);
456
+
457
+ ret += HPDF_Dict_Add (resource, "ProcSet", procset);
458
+ ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "PDF"));
459
+ ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "Text"));
460
+ ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "ImageB"));
461
+ ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "ImageC"));
462
+ ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "ImageI"));
463
+
464
+ return ret;
465
+ }
466
+
467
+
468
+ const char*
469
+ HPDF_Page_GetLocalFontName (HPDF_Page page,
470
+ HPDF_Font font)
471
+ {
472
+ HPDF_PageAttr attr = (HPDF_PageAttr )page->attr;
473
+ const char *key;
474
+
475
+ HPDF_PTRACE((" HPDF_Page_GetLocalFontName\n"));
476
+
477
+ /* whether check font-resource exists. when it does not exists,
478
+ * create font-resource
479
+ * 2006.07.21 Fixed a problem which may cause a memory leak.
480
+ */
481
+ if (!attr->fonts) {
482
+ HPDF_Dict resources;
483
+ HPDF_Dict fonts;
484
+
485
+ resources = HPDF_Page_GetInheritableItem (page, "Resources",
486
+ HPDF_OCLASS_DICT);
487
+ if (!resources)
488
+ return NULL;
489
+
490
+ fonts = HPDF_Dict_New (page->mmgr);
491
+ if (!fonts)
492
+ return NULL;
493
+
494
+ if (HPDF_Dict_Add (resources, "Font", fonts) != HPDF_OK)
495
+ return NULL;
496
+
497
+ attr->fonts = fonts;
498
+ }
499
+
500
+ /* search font-object from font-resource */
501
+ key = HPDF_Dict_GetKeyByObj (attr->fonts, font);
502
+ if (!key) {
503
+ /* if the font is not resisterd in font-resource, register font to
504
+ * font-resource.
505
+ */
506
+ char fontName[HPDF_LIMIT_MAX_NAME_LEN + 1];
507
+ char *ptr;
508
+ char *end_ptr = fontName + HPDF_LIMIT_MAX_NAME_LEN;
509
+
510
+ ptr = HPDF_StrCpy (fontName, "F", end_ptr);
511
+ HPDF_IToA (ptr, attr->fonts->list->count + 1, end_ptr);
512
+
513
+ if (HPDF_Dict_Add (attr->fonts, fontName, font) != HPDF_OK)
514
+ return NULL;
515
+
516
+ key = HPDF_Dict_GetKeyByObj (attr->fonts, font);
517
+ }
518
+
519
+ return key;
520
+ }
521
+
522
+
523
+ HPDF_Box
524
+ HPDF_Page_GetMediaBox (HPDF_Page page)
525
+ {
526
+ HPDF_Box media_box = {0, 0, 0, 0};
527
+
528
+ HPDF_PTRACE((" HPDF_Page_GetMediaBox\n"));
529
+
530
+ if (HPDF_Page_Validate (page)) {
531
+ HPDF_Array array = HPDF_Page_GetInheritableItem (page, "MediaBox",
532
+ HPDF_OCLASS_ARRAY);
533
+
534
+ if (array) {
535
+ HPDF_Real r;
536
+
537
+ r = HPDF_Array_GetItem (array, 0, HPDF_OCLASS_REAL);
538
+ if (r)
539
+ media_box.left = r->value;
540
+
541
+ r = HPDF_Array_GetItem (array, 1, HPDF_OCLASS_REAL);
542
+ if (r)
543
+ media_box.bottom = r->value;
544
+
545
+ r = HPDF_Array_GetItem (array, 2, HPDF_OCLASS_REAL);
546
+ if (r)
547
+ media_box.right = r->value;
548
+
549
+ r = HPDF_Array_GetItem (array, 3, HPDF_OCLASS_REAL);
550
+ if (r)
551
+ media_box.top = r->value;
552
+
553
+ HPDF_CheckError (page->error);
554
+ } else HPDF_RaiseError (page->error, HPDF_PAGE_CANNOT_FIND_OBJECT, 0);
555
+ }
556
+
557
+ return media_box;
558
+ }
559
+
560
+
561
+ const char*
562
+ HPDF_Page_GetXObjectName (HPDF_Page page,
563
+ HPDF_XObject xobj)
564
+ {
565
+ HPDF_PageAttr attr = (HPDF_PageAttr )page->attr;
566
+ const char *key;
567
+
568
+ HPDF_PTRACE((" HPDF_Page_GetXObjectName\n"));
569
+
570
+ if (!attr->xobjects) {
571
+ HPDF_Dict resources;
572
+ HPDF_Dict xobjects;
573
+
574
+ resources = HPDF_Page_GetInheritableItem (page, "Resources",
575
+ HPDF_OCLASS_DICT);
576
+ if (!resources)
577
+ return NULL;
578
+
579
+ xobjects = HPDF_Dict_New (page->mmgr);
580
+ if (!xobjects)
581
+ return NULL;
582
+
583
+ if (HPDF_Dict_Add (resources, "XObject", xobjects) != HPDF_OK)
584
+ return NULL;
585
+
586
+ attr->xobjects = xobjects;
587
+ }
588
+
589
+ /* search xobject-object from xobject-resource */
590
+ key = HPDF_Dict_GetKeyByObj (attr->xobjects, xobj);
591
+ if (!key) {
592
+ /* if the xobject is not resisterd in xobject-resource, register
593
+ * xobject to xobject-resource.
594
+ */
595
+ char xobj_name[HPDF_LIMIT_MAX_NAME_LEN + 1];
596
+ char *ptr;
597
+ char *end_ptr = xobj_name + HPDF_LIMIT_MAX_NAME_LEN;
598
+
599
+ ptr = HPDF_StrCpy (xobj_name, "X", end_ptr);
600
+ HPDF_IToA (ptr, attr->xobjects->list->count + 1, end_ptr);
601
+
602
+ if (HPDF_Dict_Add (attr->xobjects, xobj_name, xobj) != HPDF_OK)
603
+ return NULL;
604
+
605
+ key = HPDF_Dict_GetKeyByObj (attr->xobjects, xobj);
606
+ }
607
+
608
+ return key;
609
+ }
610
+
611
+
612
+ const char*
613
+ HPDF_Page_GetExtGStateName (HPDF_Page page,
614
+ HPDF_ExtGState state)
615
+ {
616
+ HPDF_PageAttr attr = (HPDF_PageAttr )page->attr;
617
+ const char *key;
618
+
619
+ HPDF_PTRACE((" HPDF_Page_GetExtGStateName\n"));
620
+
621
+ if (!attr->ext_gstates) {
622
+ HPDF_Dict resources;
623
+ HPDF_Dict ext_gstates;
624
+
625
+ resources = HPDF_Page_GetInheritableItem (page, "Resources",
626
+ HPDF_OCLASS_DICT);
627
+ if (!resources)
628
+ return NULL;
629
+
630
+ ext_gstates = HPDF_Dict_New (page->mmgr);
631
+ if (!ext_gstates)
632
+ return NULL;
633
+
634
+ if (HPDF_Dict_Add (resources, "ExtGState", ext_gstates) != HPDF_OK)
635
+ return NULL;
636
+
637
+ attr->ext_gstates = ext_gstates;
638
+ }
639
+
640
+ /* search ext_gstate-object from ext_gstate-resource */
641
+ key = HPDF_Dict_GetKeyByObj (attr->ext_gstates, state);
642
+ if (!key) {
643
+ /* if the ext-gstate is not resisterd in ext-gstate resource, register
644
+ * to ext-gstate resource.
645
+ */
646
+ char ext_gstate_name[HPDF_LIMIT_MAX_NAME_LEN + 1];
647
+ char *ptr;
648
+ char *end_ptr = ext_gstate_name + HPDF_LIMIT_MAX_NAME_LEN;
649
+
650
+ ptr = HPDF_StrCpy (ext_gstate_name, "E", end_ptr);
651
+ HPDF_IToA (ptr, attr->ext_gstates->list->count + 1, end_ptr);
652
+
653
+ if (HPDF_Dict_Add (attr->ext_gstates, ext_gstate_name, state) != HPDF_OK)
654
+ return NULL;
655
+
656
+ key = HPDF_Dict_GetKeyByObj (attr->ext_gstates, state);
657
+ }
658
+
659
+ return key;
660
+ }
661
+
662
+
663
+ static HPDF_STATUS
664
+ AddAnnotation (HPDF_Page page,
665
+ HPDF_Annotation annot)
666
+ {
667
+ HPDF_Array array;
668
+ HPDF_STATUS ret;
669
+
670
+ HPDF_PTRACE((" HPDF_Pages\n"));
671
+
672
+ /* find "Annots" entry */
673
+ array = HPDF_Dict_GetItem (page, "Annots", HPDF_OCLASS_ARRAY);
674
+
675
+ if (!array) {
676
+ array = HPDF_Array_New (page->mmgr);
677
+ if (!array)
678
+ return HPDF_Error_GetCode (page->error);
679
+
680
+ ret = HPDF_Dict_Add (page, "Annots", array);
681
+ if (ret != HPDF_OK)
682
+ return ret;
683
+ }
684
+
685
+ return HPDF_Array_Add (array, annot);
686
+ }
687
+
688
+
689
+ HPDF_EXPORT(HPDF_REAL)
690
+ HPDF_Page_TextWidth (HPDF_Page page,
691
+ const char *text)
692
+ {
693
+ HPDF_PageAttr attr;
694
+ HPDF_TextWidth tw;
695
+ HPDF_REAL ret = 0;
696
+ HPDF_UINT len = HPDF_StrLen(text, HPDF_LIMIT_MAX_STRING_LEN + 1);
697
+
698
+ HPDF_PTRACE((" HPDF_Page_TextWidth\n"));
699
+
700
+ if (!HPDF_Page_Validate (page) || len == 0)
701
+ return 0;
702
+
703
+ attr = (HPDF_PageAttr )page->attr;
704
+
705
+ /* no font exists */
706
+ if (!attr->gstate->font) {
707
+ HPDF_RaiseError (page->error, HPDF_PAGE_FONT_NOT_FOUND, 0);
708
+ return 0;
709
+ }
710
+
711
+ tw = HPDF_Font_TextWidth (attr->gstate->font, text, len);
712
+
713
+ ret += attr->gstate->word_space * tw.numspace;
714
+ ret += tw.width * attr->gstate->font_size / 1000;
715
+ ret += attr->gstate->char_space * tw.numchars;
716
+
717
+ HPDF_CheckError (page->error);
718
+
719
+ return ret;
720
+ }
721
+
722
+
723
+ HPDF_EXPORT(HPDF_UINT)
724
+ HPDF_Page_MeasureText (HPDF_Page page,
725
+ const char *text,
726
+ HPDF_REAL width,
727
+ HPDF_BOOL wordwrap,
728
+ HPDF_REAL *real_width)
729
+ {
730
+ HPDF_PageAttr attr;
731
+ HPDF_UINT len = HPDF_StrLen(text, HPDF_LIMIT_MAX_STRING_LEN + 1);
732
+ HPDF_UINT ret;
733
+
734
+ if (!HPDF_Page_Validate (page) || len == 0)
735
+ return 0;
736
+
737
+ attr = (HPDF_PageAttr )page->attr;
738
+
739
+ HPDF_PTRACE((" HPDF_Page_MeasureText\n"));
740
+
741
+ /* no font exists */
742
+ if (!attr->gstate->font) {
743
+ HPDF_RaiseError (page->error, HPDF_PAGE_FONT_NOT_FOUND, 0);
744
+ return 0;
745
+ }
746
+
747
+ ret = HPDF_Font_MeasureText (attr->gstate->font, text, len, width,
748
+ attr->gstate->font_size, attr->gstate->char_space,
749
+ attr->gstate->word_space, wordwrap, real_width);
750
+
751
+ HPDF_CheckError (page->error);
752
+
753
+ return ret;
754
+ }
755
+
756
+
757
+ HPDF_EXPORT(HPDF_REAL)
758
+ HPDF_Page_GetWidth (HPDF_Page page)
759
+ {
760
+ return HPDF_Page_GetMediaBox (page).right;
761
+ }
762
+
763
+
764
+ HPDF_EXPORT(HPDF_REAL)
765
+ HPDF_Page_GetHeight (HPDF_Page page)
766
+ {
767
+ return HPDF_Page_GetMediaBox (page).top;
768
+ }
769
+
770
+
771
+ HPDF_EXPORT(HPDF_Font)
772
+ HPDF_Page_GetCurrentFont (HPDF_Page page)
773
+ {
774
+ HPDF_PTRACE((" HPDF_Page_GetFontName\n"));
775
+
776
+ if (HPDF_Page_Validate (page)) {
777
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
778
+
779
+ return attr->gstate->font;
780
+ } else
781
+ return NULL;
782
+ }
783
+
784
+
785
+ HPDF_EXPORT(HPDF_REAL)
786
+ HPDF_Page_GetCurrentFontSize (HPDF_Page page)
787
+ {
788
+ HPDF_PTRACE((" HPDF_Page_GetCurrentFontSize\n"));
789
+
790
+ if (HPDF_Page_Validate (page)) {
791
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
792
+
793
+ return (attr->gstate->font) ? attr->gstate->font_size : 0;
794
+ } else
795
+ return 0;
796
+ }
797
+
798
+
799
+ HPDF_EXPORT(HPDF_TransMatrix)
800
+ HPDF_Page_GetTransMatrix (HPDF_Page page)
801
+ {
802
+ HPDF_TransMatrix DEF_MATRIX = {1, 0, 0, 1, 0, 0};
803
+
804
+ HPDF_PTRACE((" HPDF_Page_GetTransMatrix\n"));
805
+ if (HPDF_Page_Validate (page)) {
806
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
807
+
808
+ return attr->gstate->trans_matrix;
809
+ } else
810
+ return DEF_MATRIX;
811
+ }
812
+
813
+
814
+ HPDF_EXPORT(HPDF_REAL)
815
+ HPDF_Page_GetLineWidth (HPDF_Page page)
816
+ {
817
+ HPDF_PTRACE((" HPDF_Page_GetLineWidth\n"));
818
+
819
+ if (HPDF_Page_Validate (page)) {
820
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
821
+
822
+ return attr->gstate->line_width;
823
+ } else
824
+ return HPDF_DEF_LINEWIDTH;
825
+ }
826
+
827
+
828
+ HPDF_EXPORT(HPDF_LineCap)
829
+ HPDF_Page_GetLineCap (HPDF_Page page)
830
+ {
831
+ HPDF_PTRACE((" HPDF_Page_GetLineCap\n"));
832
+
833
+ if (HPDF_Page_Validate (page)) {
834
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
835
+
836
+ return attr->gstate->line_cap;
837
+ } else
838
+ return HPDF_DEF_LINECAP;
839
+ }
840
+
841
+
842
+ HPDF_EXPORT(HPDF_LineJoin)
843
+ HPDF_Page_GetLineJoin (HPDF_Page page)
844
+ {
845
+ HPDF_PTRACE((" HPDF_Page_GetLineJoin\n"));
846
+
847
+ if (HPDF_Page_Validate (page)) {
848
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
849
+
850
+ return attr->gstate->line_join;
851
+ } else
852
+ return HPDF_DEF_LINEJOIN;
853
+ }
854
+
855
+
856
+ HPDF_EXPORT(HPDF_REAL)
857
+ HPDF_Page_GetMiterLimit (HPDF_Page page)
858
+ {
859
+ HPDF_PTRACE((" HPDF_Page_GetMiterLimit\n"));
860
+
861
+ if (HPDF_Page_Validate (page)) {
862
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
863
+
864
+ return attr->gstate->miter_limit;
865
+ } else
866
+ return HPDF_DEF_MITERLIMIT;
867
+ }
868
+
869
+
870
+ HPDF_EXPORT(HPDF_DashMode)
871
+ HPDF_Page_GetDash (HPDF_Page page)
872
+ {
873
+ HPDF_DashMode mode = {{0, 0, 0, 0, 0, 0, 0, 0}, 0, 0};
874
+
875
+ HPDF_PTRACE((" HPDF_Page_GetDash\n"));
876
+
877
+ if (HPDF_Page_Validate (page)) {
878
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
879
+
880
+ mode = attr->gstate->dash_mode;
881
+ }
882
+
883
+ return mode;
884
+ }
885
+
886
+
887
+ HPDF_EXPORT(HPDF_REAL)
888
+ HPDF_Page_GetFlat (HPDF_Page page)
889
+ {
890
+ HPDF_PTRACE((" HPDF_Page_GetFlat\n"));
891
+
892
+ if (HPDF_Page_Validate (page)) {
893
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
894
+
895
+ return attr->gstate->flatness;
896
+ } else
897
+ return HPDF_DEF_FLATNESS;
898
+ }
899
+
900
+
901
+ HPDF_EXPORT(HPDF_REAL)
902
+ HPDF_Page_GetWordSpace (HPDF_Page page)
903
+ {
904
+ HPDF_PTRACE((" HPDF_Page_GetWordSpace\n"));
905
+
906
+ if (HPDF_Page_Validate (page)) {
907
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
908
+
909
+ return attr->gstate->word_space;
910
+ } else
911
+ return HPDF_DEF_WORDSPACE;
912
+ }
913
+
914
+
915
+ HPDF_EXPORT(HPDF_REAL)
916
+ HPDF_Page_GetCharSpace (HPDF_Page page)
917
+ {
918
+ HPDF_PTRACE((" HPDF_Page_GetCharSpace\n"));
919
+
920
+ if (HPDF_Page_Validate (page)) {
921
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
922
+
923
+ return attr->gstate->char_space;
924
+ } else
925
+ return HPDF_DEF_CHARSPACE;
926
+ }
927
+
928
+
929
+ HPDF_EXPORT(HPDF_REAL)
930
+ HPDF_Page_GetHorizontalScalling (HPDF_Page page)
931
+ {
932
+ HPDF_PTRACE((" HPDF_Page_GetHorizontalScalling\n"));
933
+
934
+ if (HPDF_Page_Validate (page)) {
935
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
936
+
937
+ return attr->gstate->h_scalling;
938
+ } else
939
+ return HPDF_DEF_HSCALING;
940
+ }
941
+
942
+
943
+ HPDF_EXPORT(HPDF_REAL)
944
+ HPDF_Page_GetTextLeading (HPDF_Page page)
945
+ {
946
+ HPDF_PTRACE((" HPDF_Page_GetTextLeading\n"));
947
+
948
+ if (HPDF_Page_Validate (page)) {
949
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
950
+
951
+ return attr->gstate->text_leading;
952
+ } else
953
+ return HPDF_DEF_LEADING;
954
+ }
955
+
956
+
957
+ HPDF_EXPORT(HPDF_TextRenderingMode)
958
+ HPDF_Page_GetTextRenderingMode (HPDF_Page page)
959
+ {
960
+ HPDF_PTRACE((" HPDF_Page_GettextRenderingMode\n"));
961
+
962
+ if (HPDF_Page_Validate (page)) {
963
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
964
+
965
+ return attr->gstate->rendering_mode;
966
+ } else
967
+ return HPDF_DEF_RENDERING_MODE;
968
+ }
969
+
970
+
971
+ HPDF_EXPORT(HPDF_REAL)
972
+ HPDF_Page_GetTextRaise (HPDF_Page page)
973
+ {
974
+ return HPDF_Page_GetTextRise (page);
975
+ }
976
+
977
+ HPDF_EXPORT(HPDF_REAL)
978
+ HPDF_Page_GetTextRise (HPDF_Page page)
979
+ {
980
+ HPDF_PTRACE((" HPDF_Page_GetTextRise\n"));
981
+
982
+ if (HPDF_Page_Validate (page)) {
983
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
984
+
985
+ return attr->gstate->text_rise;
986
+ } else
987
+ return HPDF_DEF_RISE;
988
+ }
989
+
990
+
991
+ HPDF_EXPORT(HPDF_RGBColor)
992
+ HPDF_Page_GetRGBFill (HPDF_Page page)
993
+ {
994
+ HPDF_RGBColor DEF_RGB_COLOR = {0, 0, 0};
995
+
996
+ HPDF_PTRACE((" HPDF_Page_GetRGBFill\n"));
997
+
998
+ if (HPDF_Page_Validate (page)) {
999
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1000
+
1001
+ if (attr->gstate->cs_fill == HPDF_CS_DEVICE_RGB)
1002
+ return attr->gstate->rgb_fill;
1003
+ }
1004
+
1005
+ return DEF_RGB_COLOR;
1006
+ }
1007
+
1008
+
1009
+ HPDF_EXPORT(HPDF_RGBColor)
1010
+ HPDF_Page_GetRGBStroke (HPDF_Page page)
1011
+ {
1012
+ HPDF_RGBColor DEF_RGB_COLOR = {0, 0, 0};
1013
+
1014
+ HPDF_PTRACE((" HPDF_Page_GetRGBStroke\n"));
1015
+
1016
+ if (HPDF_Page_Validate (page)) {
1017
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1018
+
1019
+ if (attr->gstate->cs_stroke == HPDF_CS_DEVICE_RGB)
1020
+ return attr->gstate->rgb_stroke;
1021
+ }
1022
+
1023
+ return DEF_RGB_COLOR;
1024
+ }
1025
+
1026
+ HPDF_EXPORT(HPDF_CMYKColor)
1027
+ HPDF_Page_GetCMYKFill (HPDF_Page page)
1028
+ {
1029
+ HPDF_CMYKColor DEF_CMYK_COLOR = {0, 0, 0, 0};
1030
+
1031
+ HPDF_PTRACE((" HPDF_Page_GetCMYKFill\n"));
1032
+
1033
+ if (HPDF_Page_Validate (page)) {
1034
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1035
+
1036
+ if (attr->gstate->cs_fill == HPDF_CS_DEVICE_CMYK)
1037
+ return attr->gstate->cmyk_fill;
1038
+ }
1039
+
1040
+ return DEF_CMYK_COLOR;
1041
+ }
1042
+
1043
+
1044
+ HPDF_EXPORT(HPDF_CMYKColor)
1045
+ HPDF_Page_GetCMYKStroke (HPDF_Page page)
1046
+ {
1047
+ HPDF_CMYKColor DEF_CMYK_COLOR = {0, 0, 0, 0};
1048
+
1049
+ HPDF_PTRACE((" HPDF_Page_GetCMYKStroke\n"));
1050
+
1051
+ if (HPDF_Page_Validate (page)) {
1052
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1053
+
1054
+ if (attr->gstate->cs_stroke == HPDF_CS_DEVICE_CMYK)
1055
+ return attr->gstate->cmyk_stroke;
1056
+ }
1057
+
1058
+ return DEF_CMYK_COLOR;
1059
+ }
1060
+
1061
+
1062
+ HPDF_EXPORT(HPDF_REAL)
1063
+ HPDF_Page_GetGrayFill (HPDF_Page page)
1064
+ {
1065
+ HPDF_PTRACE((" HPDF_Page_GetGrayFill\n"));
1066
+
1067
+ if (HPDF_Page_Validate (page)) {
1068
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1069
+
1070
+ if (attr->gstate->cs_fill == HPDF_CS_DEVICE_GRAY)
1071
+ return attr->gstate->gray_fill;
1072
+ }
1073
+
1074
+ return 0;
1075
+ }
1076
+
1077
+
1078
+ HPDF_EXPORT(HPDF_REAL)
1079
+ HPDF_Page_GetGrayStroke (HPDF_Page page)
1080
+ {
1081
+ HPDF_PTRACE((" HPDF_Page_GetGrayStroke\n"));
1082
+
1083
+ if (HPDF_Page_Validate (page)) {
1084
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1085
+
1086
+ if (attr->gstate->cs_stroke == HPDF_CS_DEVICE_GRAY)
1087
+ return attr->gstate->gray_stroke;
1088
+ }
1089
+
1090
+ return 0;
1091
+ }
1092
+
1093
+
1094
+ HPDF_EXPORT(HPDF_ColorSpace)
1095
+ HPDF_Page_GetStrokingColorSpace (HPDF_Page page)
1096
+ {
1097
+ HPDF_PTRACE((" HPDF_Page_GetStrokingColorSpace\n"));
1098
+
1099
+ if (HPDF_Page_Validate (page))
1100
+ return ((HPDF_PageAttr)page->attr)->gstate->cs_stroke;
1101
+
1102
+ return HPDF_CS_EOF;
1103
+ }
1104
+
1105
+
1106
+ HPDF_EXPORT(HPDF_ColorSpace)
1107
+ HPDF_Page_GetFillingColorSpace (HPDF_Page page)
1108
+ {
1109
+ HPDF_PTRACE((" HPDF_Page_GetFillingColorSpace\n"));
1110
+
1111
+ if (HPDF_Page_Validate (page))
1112
+ return ((HPDF_PageAttr)page->attr)->gstate->cs_fill;
1113
+
1114
+ return HPDF_CS_EOF;
1115
+ }
1116
+
1117
+
1118
+ HPDF_EXPORT(HPDF_TransMatrix)
1119
+ HPDF_Page_GetTextMatrix (HPDF_Page page)
1120
+ {
1121
+ HPDF_TransMatrix DEF_MATRIX = {1, 0, 0, 1, 0, 0};
1122
+
1123
+ HPDF_PTRACE((" HPDF_Page_GetTextMatrix\n"));
1124
+ if (HPDF_Page_Validate (page)) {
1125
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1126
+
1127
+ return attr->text_matrix;
1128
+ } else
1129
+ return DEF_MATRIX;
1130
+ }
1131
+
1132
+
1133
+ HPDF_EXPORT(HPDF_UINT)
1134
+ HPDF_Page_GetGStateDepth (HPDF_Page page)
1135
+ {
1136
+ HPDF_PTRACE((" HPDF_Page_GetGStateDepth\n"));
1137
+
1138
+ if (HPDF_Page_Validate (page)) {
1139
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1140
+
1141
+ return attr->gstate->depth;
1142
+ } else
1143
+ return 0;
1144
+ }
1145
+
1146
+
1147
+ HPDF_EXPORT(HPDF_UINT16)
1148
+ HPDF_Page_GetGMode (HPDF_Page page)
1149
+ {
1150
+ if (HPDF_Page_Validate (page))
1151
+ return ((HPDF_PageAttr)page->attr)->gmode;
1152
+
1153
+ return 0;
1154
+ }
1155
+
1156
+ HPDF_EXPORT(HPDF_Point)
1157
+ HPDF_Page_GetCurrentPos (HPDF_Page page)
1158
+ {
1159
+ HPDF_Point pos = {0, 0};
1160
+
1161
+ HPDF_PTRACE((" HPDF_Page_GetCurrentPos\n"));
1162
+
1163
+ if (HPDF_Page_Validate (page)) {
1164
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1165
+
1166
+ if (attr->gmode & HPDF_GMODE_PATH_OBJECT)
1167
+ pos = attr->cur_pos;
1168
+ }
1169
+
1170
+ return pos;
1171
+ }
1172
+
1173
+
1174
+ HPDF_EXPORT(HPDF_STATUS)
1175
+ HPDF_Page_GetCurrentPos2 (HPDF_Page page,
1176
+ HPDF_Point *pos)
1177
+ {
1178
+ HPDF_PageAttr attr;
1179
+ HPDF_PTRACE((" HPDF_Page_GetCurrentPos2\n"));
1180
+
1181
+ pos->x = 0;
1182
+ pos->y = 0;
1183
+ if (!HPDF_Page_Validate (page))
1184
+ return HPDF_INVALID_PAGE;
1185
+
1186
+ attr = (HPDF_PageAttr)page->attr;
1187
+
1188
+ if (attr->gmode & HPDF_GMODE_PATH_OBJECT)
1189
+ *pos = attr->cur_pos;
1190
+
1191
+ return HPDF_OK;
1192
+ }
1193
+
1194
+
1195
+ HPDF_EXPORT(HPDF_Point)
1196
+ HPDF_Page_GetCurrentTextPos (HPDF_Page page)
1197
+ {
1198
+ HPDF_Point pos = {0, 0};
1199
+
1200
+ HPDF_PTRACE((" HPDF_Page_GetCurrentTextPos\n"));
1201
+
1202
+ if (HPDF_Page_Validate (page)) {
1203
+ HPDF_PageAttr attr = (HPDF_PageAttr)page->attr;
1204
+
1205
+ if (attr->gmode & HPDF_GMODE_TEXT_OBJECT)
1206
+ pos = attr->text_pos;
1207
+ }
1208
+
1209
+ return pos;
1210
+ }
1211
+
1212
+
1213
+ HPDF_EXPORT(HPDF_STATUS)
1214
+ HPDF_Page_GetCurrentTextPos2 (HPDF_Page page,
1215
+ HPDF_Point *pos)
1216
+ {
1217
+ HPDF_PageAttr attr;
1218
+
1219
+ HPDF_PTRACE((" HPDF_Page_GetCurrentTextPos2\n"));
1220
+
1221
+ pos->x = 0;
1222
+ pos->y = 0;
1223
+ if (!HPDF_Page_Validate (page))
1224
+ return HPDF_INVALID_PAGE;
1225
+
1226
+ attr = (HPDF_PageAttr)page->attr;
1227
+
1228
+ if (attr->gmode & HPDF_GMODE_TEXT_OBJECT)
1229
+ *pos = attr->text_pos;
1230
+
1231
+ return HPDF_OK;
1232
+ }
1233
+
1234
+
1235
+ HPDF_STATUS
1236
+ HPDF_Page_SetBoxValue (HPDF_Page page,
1237
+ const char *name,
1238
+ HPDF_UINT index,
1239
+ HPDF_REAL value)
1240
+ {
1241
+ HPDF_Real r;
1242
+ HPDF_Array array;
1243
+
1244
+ HPDF_PTRACE((" HPDF_Page_SetBoxValue\n"));
1245
+
1246
+ if (!HPDF_Page_Validate (page))
1247
+ return HPDF_INVALID_PAGE;
1248
+
1249
+ array = HPDF_Page_GetInheritableItem (page, name, HPDF_OCLASS_ARRAY);
1250
+ if (!array)
1251
+ return HPDF_SetError (page->error, HPDF_PAGE_CANNOT_FIND_OBJECT, 0);
1252
+
1253
+ r = HPDF_Array_GetItem (array, index, HPDF_OCLASS_REAL);
1254
+ if (!r)
1255
+ return HPDF_SetError (page->error, HPDF_PAGE_INVALID_INDEX, 0);
1256
+
1257
+ r->value = value;
1258
+
1259
+ return HPDF_OK;
1260
+ }
1261
+
1262
+
1263
+ HPDF_EXPORT(HPDF_STATUS)
1264
+ HPDF_Page_SetRotate (HPDF_Page page,
1265
+ HPDF_UINT16 angle)
1266
+ {
1267
+ HPDF_Number n;
1268
+ HPDF_STATUS ret = HPDF_OK;
1269
+
1270
+ HPDF_PTRACE((" HPDF_Page_SetRotate\n"));
1271
+
1272
+ if (!HPDF_Page_Validate (page))
1273
+ return HPDF_INVALID_PAGE;
1274
+
1275
+ if (angle % 90 != 0)
1276
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_ROTATE_VALUE,
1277
+ (HPDF_STATUS)angle);
1278
+
1279
+ n = HPDF_Page_GetInheritableItem (page, "Rotate", HPDF_OCLASS_NUMBER);
1280
+
1281
+ if (!n)
1282
+ ret = HPDF_Dict_AddNumber (page, "Rotate", angle);
1283
+ else
1284
+ n->value = angle;
1285
+
1286
+ return ret;
1287
+ }
1288
+
1289
+
1290
+ HPDF_EXPORT(HPDF_STATUS)
1291
+ HPDF_Page_SetWidth (HPDF_Page page,
1292
+ HPDF_REAL value)
1293
+ {
1294
+ HPDF_PTRACE((" HPDF_Page_SetWidth\n"));
1295
+
1296
+ if (value < 3 || value > 14400)
1297
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_SIZE, 0);
1298
+
1299
+ if (HPDF_Page_SetBoxValue (page, "MediaBox", 2, value) != HPDF_OK)
1300
+ return HPDF_CheckError (page->error);
1301
+
1302
+ return HPDF_OK;
1303
+ }
1304
+
1305
+
1306
+ HPDF_EXPORT(HPDF_STATUS)
1307
+ HPDF_Page_SetHeight (HPDF_Page page,
1308
+ HPDF_REAL value)
1309
+ {
1310
+ HPDF_PTRACE((" HPDF_Page_SetWidth\n"));
1311
+
1312
+ if (value < 3 || value > 14400)
1313
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_SIZE, 0);
1314
+
1315
+ if (HPDF_Page_SetBoxValue (page, "MediaBox", 3, value) != HPDF_OK)
1316
+ return HPDF_CheckError (page->error);
1317
+
1318
+ return HPDF_OK;
1319
+ }
1320
+
1321
+
1322
+ HPDF_EXPORT(HPDF_STATUS)
1323
+ HPDF_Page_SetSize (HPDF_Page page,
1324
+ HPDF_PageSizes size,
1325
+ HPDF_PageDirection direction)
1326
+ {
1327
+ HPDF_STATUS ret = HPDF_OK;
1328
+
1329
+ HPDF_PTRACE((" HPDF_Page_SetSize\n"));
1330
+
1331
+ if (!HPDF_Page_Validate (page))
1332
+ return HPDF_INVALID_PAGE;
1333
+
1334
+ if (size < 0 || size > HPDF_PAGE_SIZE_EOF)
1335
+ return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_SIZE,
1336
+ (HPDF_STATUS)direction);
1337
+
1338
+ if (direction == HPDF_PAGE_LANDSCAPE) {
1339
+ ret += HPDF_Page_SetHeight (page,
1340
+ HPDF_PREDEFINED_PAGE_SIZES[(HPDF_UINT)size].x);
1341
+ ret += HPDF_Page_SetWidth (page,
1342
+ HPDF_PREDEFINED_PAGE_SIZES[(HPDF_UINT)size].y);
1343
+ } else if (direction == HPDF_PAGE_PORTRAIT) {
1344
+ ret += HPDF_Page_SetHeight (page,
1345
+ HPDF_PREDEFINED_PAGE_SIZES[(HPDF_UINT)size].y);
1346
+ ret += HPDF_Page_SetWidth (page,
1347
+ HPDF_PREDEFINED_PAGE_SIZES[(HPDF_UINT)size].x);
1348
+ } else
1349
+ ret = HPDF_SetError (page->error, HPDF_PAGE_INVALID_DIRECTION,
1350
+ (HPDF_STATUS)direction);
1351
+
1352
+ if (ret != HPDF_OK)
1353
+ return HPDF_CheckError (page->error);
1354
+
1355
+ return HPDF_OK;
1356
+ }
1357
+
1358
+
1359
+ HPDF_BOOL
1360
+ HPDF_Page_Validate (HPDF_Page page)
1361
+ {
1362
+ HPDF_Obj_Header *header = (HPDF_Obj_Header *)page;
1363
+
1364
+ HPDF_PTRACE((" HPDF_Page_Validate\n"));
1365
+
1366
+ if (!page || !page->attr)
1367
+ return HPDF_FALSE;
1368
+
1369
+ if (header->obj_class != (HPDF_OCLASS_DICT | HPDF_OSUBCLASS_PAGE))
1370
+ return HPDF_FALSE;
1371
+
1372
+ return HPDF_TRUE;
1373
+ }
1374
+
1375
+
1376
+ HPDF_EXPORT(HPDF_Destination)
1377
+ HPDF_Page_CreateDestination (HPDF_Page page)
1378
+ {
1379
+ HPDF_PageAttr attr;
1380
+ HPDF_Destination dst;
1381
+
1382
+ HPDF_PTRACE((" HPDF_Page_CreateDestination\n"));
1383
+
1384
+ if (!HPDF_Page_Validate (page))
1385
+ return NULL;
1386
+
1387
+ attr = (HPDF_PageAttr)page->attr;
1388
+
1389
+ dst = HPDF_Destination_New (page->mmgr, page, attr->xref);
1390
+ if (!dst)
1391
+ HPDF_CheckError (page->error);
1392
+
1393
+ return dst;
1394
+ }
1395
+
1396
+
1397
+ HPDF_EXPORT(HPDF_Annotation)
1398
+ HPDF_Page_CreateTextAnnot (HPDF_Page page,
1399
+ HPDF_Rect rect,
1400
+ const char *text,
1401
+ HPDF_Encoder encoder)
1402
+ {
1403
+ HPDF_PageAttr attr;
1404
+ HPDF_Annotation annot;
1405
+
1406
+ HPDF_PTRACE((" HPDF_Page_CreateTextAnnot\n"));
1407
+
1408
+ if (!HPDF_Page_Validate (page))
1409
+ return NULL;
1410
+
1411
+ attr = (HPDF_PageAttr)page->attr;
1412
+
1413
+ if (encoder && !HPDF_Encoder_Validate (encoder)) {
1414
+ HPDF_RaiseError (page->error, HPDF_INVALID_ENCODER, 0);
1415
+ return NULL;
1416
+ }
1417
+
1418
+ annot = HPDF_TextAnnot_New (page->mmgr, attr->xref, rect, text, encoder);
1419
+ if (annot) {
1420
+ if (AddAnnotation (page, annot) != HPDF_OK) {
1421
+ HPDF_CheckError (page->error);
1422
+ annot = NULL;
1423
+ }
1424
+ } else
1425
+ HPDF_CheckError (page->error);
1426
+
1427
+ return annot;
1428
+ }
1429
+
1430
+
1431
+ HPDF_EXPORT(HPDF_Annotation)
1432
+ HPDF_Page_CreateLinkAnnot (HPDF_Page page,
1433
+ HPDF_Rect rect,
1434
+ HPDF_Destination dst)
1435
+ {
1436
+ HPDF_PageAttr attr;
1437
+ HPDF_Annotation annot;
1438
+
1439
+ HPDF_PTRACE((" HPDF_Page_CreateLinkAnnot\n"));
1440
+
1441
+ if (!HPDF_Page_Validate (page))
1442
+ return NULL;
1443
+
1444
+ attr = (HPDF_PageAttr)page->attr;
1445
+
1446
+ if (!HPDF_Destination_Validate (dst)) {
1447
+ HPDF_RaiseError (page->error, HPDF_INVALID_DESTINATION, 0);
1448
+ return NULL;
1449
+ }
1450
+
1451
+ annot = HPDF_LinkAnnot_New (page->mmgr, attr->xref, rect, dst);
1452
+ if (annot) {
1453
+ if (AddAnnotation (page, annot) != HPDF_OK) {
1454
+ HPDF_CheckError (page->error);
1455
+ annot = NULL;
1456
+ }
1457
+ } else
1458
+ HPDF_CheckError (page->error);
1459
+
1460
+ return annot;
1461
+ }
1462
+
1463
+
1464
+ HPDF_EXPORT(HPDF_Annotation)
1465
+ HPDF_Page_CreateURILinkAnnot (HPDF_Page page,
1466
+ HPDF_Rect rect,
1467
+ const char *uri)
1468
+ {
1469
+ HPDF_PageAttr attr;
1470
+ HPDF_Annotation annot;
1471
+
1472
+ HPDF_PTRACE((" HPDF_Page_CreateURILinkAnnot\n"));
1473
+
1474
+ if (!HPDF_Page_Validate (page))
1475
+ return NULL;
1476
+
1477
+ attr = (HPDF_PageAttr)page->attr;
1478
+
1479
+ if (HPDF_StrLen (uri, HPDF_LIMIT_MAX_STRING_LEN) <= 0) {
1480
+ HPDF_RaiseError (page->error, HPDF_INVALID_URI, 0);
1481
+ return NULL;
1482
+ }
1483
+
1484
+ annot = HPDF_URILinkAnnot_New (page->mmgr, attr->xref, rect, uri);
1485
+ if (annot) {
1486
+ if (AddAnnotation (page, annot) != HPDF_OK) {
1487
+ HPDF_CheckError (page->error);
1488
+ annot = NULL;
1489
+ }
1490
+ } else
1491
+ HPDF_CheckError (page->error);
1492
+
1493
+ return annot;
1494
+ }
1495
+
1496
+
1497
+ void
1498
+ HPDF_Page_SetFilter (HPDF_Page page,
1499
+ HPDF_UINT filter)
1500
+ {
1501
+ HPDF_PageAttr attr;
1502
+
1503
+ HPDF_PTRACE((" HPDF_Page_SetFilter\n"));
1504
+
1505
+ attr = (HPDF_PageAttr)page->attr;
1506
+ attr->contents->filter = filter;
1507
+ }
1508
+