hpdf 2.0.8

Sign up to get free protection for your applications and to get access to all the features.
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
+