hpdf 2.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/History +57 -0
- data/License +25 -0
- data/README +165 -0
- data/examples/arc_demo.rb +82 -0
- data/examples/demo.rb +92 -0
- data/examples/encryption.rb +41 -0
- data/examples/ext_gstater_demo.rb +171 -0
- data/examples/font_demo.rb +67 -0
- data/examples/jpfont_demo.rb +122 -0
- data/examples/line_demo.rb +301 -0
- data/examples/slide_show_demo.rb +139 -0
- data/examples/text_demo2.rb +189 -0
- data/examples/ttfont_demo.rb +106 -0
- data/ext/extconf.rb +6 -0
- data/ext/hpdf.c +3779 -0
- data/ext/hpdf_annotation.c +415 -0
- data/ext/hpdf_array.c +344 -0
- data/ext/hpdf_binary.c +117 -0
- data/ext/hpdf_boolean.c +47 -0
- data/ext/hpdf_catalog.c +354 -0
- data/ext/hpdf_destination.c +339 -0
- data/ext/hpdf_dict.c +488 -0
- data/ext/hpdf_doc.c +2020 -0
- data/ext/hpdf_doc_png.c +137 -0
- data/ext/hpdf_encoder.c +2991 -0
- data/ext/hpdf_encoder_cns.c +36359 -0
- data/ext/hpdf_encoder_cnt.c +15307 -0
- data/ext/hpdf_encoder_jp.c +16125 -0
- data/ext/hpdf_encoder_kr.c +27978 -0
- data/ext/hpdf_encrypt.c +632 -0
- data/ext/hpdf_encryptdict.c +240 -0
- data/ext/hpdf_error.c +114 -0
- data/ext/hpdf_ext_gstate.c +150 -0
- data/ext/hpdf_font.c +229 -0
- data/ext/hpdf_font_cid.c +1030 -0
- data/ext/hpdf_font_tt.c +406 -0
- data/ext/hpdf_font_type1.c +391 -0
- data/ext/hpdf_fontdef.c +56 -0
- data/ext/hpdf_fontdef_base14.c +4506 -0
- data/ext/hpdf_fontdef_cid.c +194 -0
- data/ext/hpdf_fontdef_cns.c +471 -0
- data/ext/hpdf_fontdef_cnt.c +250 -0
- data/ext/hpdf_fontdef_jp.c +1904 -0
- data/ext/hpdf_fontdef_kr.c +1572 -0
- data/ext/hpdf_fontdef_tt.c +2230 -0
- data/ext/hpdf_fontdef_type1.c +524 -0
- data/ext/hpdf_gstate.c +119 -0
- data/ext/hpdf_image.c +568 -0
- data/ext/hpdf_image_png.c +424 -0
- data/ext/hpdf_info.c +164 -0
- data/ext/hpdf_list.c +333 -0
- data/ext/hpdf_mmgr.c +243 -0
- data/ext/hpdf_name.c +71 -0
- data/ext/hpdf_null.c +31 -0
- data/ext/hpdf_number.c +49 -0
- data/ext/hpdf_objects.c +172 -0
- data/ext/hpdf_outline.c +329 -0
- data/ext/hpdf_page_label.c +74 -0
- data/ext/hpdf_page_operator.c +2764 -0
- data/ext/hpdf_pages.c +1508 -0
- data/ext/hpdf_real.c +61 -0
- data/ext/hpdf_streams.c +1435 -0
- data/ext/hpdf_string.c +189 -0
- data/ext/hpdf_utils.c +438 -0
- data/ext/hpdf_xref.c +348 -0
- data/ext/include/hpdf.h +1227 -0
- data/ext/include/hpdf_annotation.h +74 -0
- data/ext/include/hpdf_catalog.h +81 -0
- data/ext/include/hpdf_conf.h +76 -0
- data/ext/include/hpdf_consts.h +549 -0
- data/ext/include/hpdf_destination.h +41 -0
- data/ext/include/hpdf_doc.h +159 -0
- data/ext/include/hpdf_encoder.h +311 -0
- data/ext/include/hpdf_encrypt.h +156 -0
- data/ext/include/hpdf_encryptdict.h +66 -0
- data/ext/include/hpdf_error.h +201 -0
- data/ext/include/hpdf_ext_gstate.h +38 -0
- data/ext/include/hpdf_font.h +112 -0
- data/ext/include/hpdf_fontdef.h +403 -0
- data/ext/include/hpdf_gstate.h +80 -0
- data/ext/include/hpdf_image.h +72 -0
- data/ext/include/hpdf_info.h +48 -0
- data/ext/include/hpdf_list.h +85 -0
- data/ext/include/hpdf_mmgr.h +82 -0
- data/ext/include/hpdf_objects.h +587 -0
- data/ext/include/hpdf_outline.h +74 -0
- data/ext/include/hpdf_page_label.h +35 -0
- data/ext/include/hpdf_pages.h +128 -0
- data/ext/include/hpdf_streams.h +276 -0
- data/ext/include/hpdf_types.h +488 -0
- data/ext/include/hpdf_utils.h +161 -0
- data/tests/arc_demo.rb +82 -0
- data/tests/demo.rb +91 -0
- data/tests/encryption.rb +41 -0
- data/tests/ext_gstater_demo.rb +171 -0
- data/tests/font_demo.rb +67 -0
- data/tests/line_demo.rb +301 -0
- data/tests/slide_show_demo.rb +139 -0
- data/tests/test_all_examples.rb +31 -0
- data/tests/text_demo2.rb +189 -0
- metadata +147 -0
@@ -0,0 +1,424 @@
|
|
1
|
+
/*
|
2
|
+
* << Haru Free PDF Library 2.0.3 >> -- hpdf_image.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_image.h"
|
18
|
+
|
19
|
+
#ifndef HPDF_NOPNGLIB
|
20
|
+
#include <png.h>
|
21
|
+
|
22
|
+
static void
|
23
|
+
PngErrorFunc (png_structp png_ptr,
|
24
|
+
const char *msg);
|
25
|
+
|
26
|
+
|
27
|
+
static void
|
28
|
+
PngReadFunc (png_structp png_ptr,
|
29
|
+
png_bytep data,
|
30
|
+
png_uint_32 length)
|
31
|
+
{
|
32
|
+
HPDF_UINT len = length;
|
33
|
+
HPDF_Stream stream = (HPDF_Stream)png_get_io_ptr (png_ptr);
|
34
|
+
|
35
|
+
HPDF_Stream_Read (stream, data, &len);
|
36
|
+
}
|
37
|
+
|
38
|
+
|
39
|
+
static HPDF_STATUS
|
40
|
+
LoadPngData (HPDF_Dict image,
|
41
|
+
HPDF_Stream png_data,
|
42
|
+
HPDF_BOOL delayed_loading);
|
43
|
+
|
44
|
+
|
45
|
+
static void
|
46
|
+
PngErrorFunc (png_structp png_ptr,
|
47
|
+
const char *msg);
|
48
|
+
|
49
|
+
|
50
|
+
static HPDF_STATUS
|
51
|
+
ReadPngData_Interlaced (HPDF_Dict image,
|
52
|
+
png_structp png_ptr,
|
53
|
+
png_infop info_ptr);
|
54
|
+
|
55
|
+
|
56
|
+
static HPDF_STATUS
|
57
|
+
ReadPngData (HPDF_Dict image,
|
58
|
+
png_structp png_ptr,
|
59
|
+
png_infop info_ptr);
|
60
|
+
|
61
|
+
|
62
|
+
static HPDF_STATUS
|
63
|
+
CreatePallet (HPDF_Dict image,
|
64
|
+
png_structp png_ptr,
|
65
|
+
png_infop info_ptr);
|
66
|
+
|
67
|
+
|
68
|
+
static HPDF_STATUS
|
69
|
+
PngBeforeWrite (HPDF_Dict obj);
|
70
|
+
|
71
|
+
|
72
|
+
static HPDF_STATUS
|
73
|
+
PngAfterWrite (HPDF_Dict obj);
|
74
|
+
|
75
|
+
|
76
|
+
/*---------------------------------------------------------------------------*/
|
77
|
+
|
78
|
+
static void
|
79
|
+
PngErrorFunc (png_structp png_ptr,
|
80
|
+
const char *msg)
|
81
|
+
{
|
82
|
+
char error_number[16];
|
83
|
+
HPDF_UINT i;
|
84
|
+
HPDF_STATUS detail_no;
|
85
|
+
HPDF_Error error;
|
86
|
+
|
87
|
+
/* pick out error-number from error message */
|
88
|
+
HPDF_MemSet (error_number, 0, 16);
|
89
|
+
|
90
|
+
for (i = 0; i < 15; i++) {
|
91
|
+
error_number[i] = *(msg + i);
|
92
|
+
if (*(msg + i + 1) == ' ')
|
93
|
+
break;
|
94
|
+
}
|
95
|
+
|
96
|
+
error = (HPDF_Error)png_get_error_ptr (png_ptr);
|
97
|
+
detail_no = (HPDF_STATUS)HPDF_AToI (error_number);
|
98
|
+
HPDF_SetError (error, HPDF_LIBPNG_ERROR, detail_no);
|
99
|
+
}
|
100
|
+
|
101
|
+
|
102
|
+
static HPDF_STATUS
|
103
|
+
ReadPngData_Interlaced (HPDF_Dict image,
|
104
|
+
png_structp png_ptr,
|
105
|
+
png_infop info_ptr)
|
106
|
+
{
|
107
|
+
png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
|
108
|
+
png_bytep* row_pointers = HPDF_GetMem (image->mmgr,
|
109
|
+
info_ptr->height * sizeof (png_bytep));
|
110
|
+
|
111
|
+
if (row_pointers) {
|
112
|
+
HPDF_UINT i;
|
113
|
+
|
114
|
+
HPDF_MemSet (row_pointers, 0, info_ptr->height * sizeof (png_bytep));
|
115
|
+
for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
|
116
|
+
row_pointers[i] = HPDF_GetMem (image->mmgr, len);
|
117
|
+
|
118
|
+
if (image->error->error_no != HPDF_OK)
|
119
|
+
break;
|
120
|
+
}
|
121
|
+
|
122
|
+
if (image->error->error_no == HPDF_OK) {
|
123
|
+
/* } else { remove this line */
|
124
|
+
png_read_image(png_ptr, row_pointers);
|
125
|
+
/* if (image->error->error_no != HPDF_OK) { remove this line */
|
126
|
+
if (image->error->error_no == HPDF_OK) { /* add this line */
|
127
|
+
for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
|
128
|
+
if (HPDF_Stream_Write (image->stream, row_pointers[i], len) !=
|
129
|
+
HPDF_OK)
|
130
|
+
break;
|
131
|
+
}
|
132
|
+
}
|
133
|
+
}
|
134
|
+
|
135
|
+
/* clean up */
|
136
|
+
for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
|
137
|
+
HPDF_FreeMem (image->mmgr, row_pointers[i]);
|
138
|
+
/* i-- remove this line */
|
139
|
+
}
|
140
|
+
|
141
|
+
HPDF_FreeMem (image->mmgr, row_pointers);
|
142
|
+
}
|
143
|
+
|
144
|
+
return image->error->error_no;
|
145
|
+
}
|
146
|
+
|
147
|
+
static HPDF_STATUS
|
148
|
+
ReadPngData (HPDF_Dict image,
|
149
|
+
png_structp png_ptr,
|
150
|
+
png_infop info_ptr)
|
151
|
+
{
|
152
|
+
png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr);
|
153
|
+
png_bytep buf_ptr = HPDF_GetMem (image->mmgr, len);
|
154
|
+
|
155
|
+
if (buf_ptr) {
|
156
|
+
HPDF_UINT i;
|
157
|
+
|
158
|
+
for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) {
|
159
|
+
png_read_rows(png_ptr, (png_byte**)&buf_ptr, NULL, 1);
|
160
|
+
if (image->error->error_no != HPDF_OK)
|
161
|
+
break;
|
162
|
+
|
163
|
+
if (HPDF_Stream_Write (image->stream, buf_ptr, len) != HPDF_OK)
|
164
|
+
break;
|
165
|
+
}
|
166
|
+
|
167
|
+
HPDF_FreeMem (image->mmgr, buf_ptr);
|
168
|
+
}
|
169
|
+
|
170
|
+
return image->error->error_no;
|
171
|
+
}
|
172
|
+
|
173
|
+
|
174
|
+
static HPDF_STATUS
|
175
|
+
CreatePallet (HPDF_Dict image,
|
176
|
+
png_structp png_ptr,
|
177
|
+
png_infop info_ptr)
|
178
|
+
{
|
179
|
+
HPDF_INT num_pl = 0;
|
180
|
+
png_color *src_pl = NULL;
|
181
|
+
HPDF_BYTE *ppallet;
|
182
|
+
HPDF_BYTE *p;
|
183
|
+
HPDF_UINT i;
|
184
|
+
HPDF_Array array;
|
185
|
+
|
186
|
+
/* png_get_PLTE does not call PngErrorFunc even if it failed.
|
187
|
+
* so we call HPDF_Set_Error to set error-code.
|
188
|
+
*/
|
189
|
+
if (png_get_PLTE(png_ptr, info_ptr, (png_color**)&src_pl, &num_pl) !=
|
190
|
+
PNG_INFO_PLTE)
|
191
|
+
return HPDF_SetError (image->error, HPDF_LIBPNG_ERROR,
|
192
|
+
HPDF_CANNOT_GET_PALLET);
|
193
|
+
|
194
|
+
|
195
|
+
/* make a pallet array for indexed image. */
|
196
|
+
ppallet = HPDF_GetMem (image->mmgr, num_pl * 3);
|
197
|
+
if (!ppallet)
|
198
|
+
return image->error->error_no;
|
199
|
+
|
200
|
+
p = ppallet;
|
201
|
+
for (i = 0; i < num_pl; i++, src_pl++) {
|
202
|
+
*p++ = src_pl->red;
|
203
|
+
*p++ = src_pl->green;
|
204
|
+
*p++ = src_pl->blue;
|
205
|
+
}
|
206
|
+
|
207
|
+
array = HPDF_Array_New (image->mmgr);
|
208
|
+
if (array) {
|
209
|
+
HPDF_Binary b;
|
210
|
+
|
211
|
+
HPDF_Dict_Add (image, "ColorSpace", array);
|
212
|
+
|
213
|
+
HPDF_Array_AddName (array, "Indexed");
|
214
|
+
HPDF_Array_AddName (array, "DeviceRGB");
|
215
|
+
HPDF_Array_AddNumber (array, num_pl - 1);
|
216
|
+
|
217
|
+
b = HPDF_Binary_New (image->mmgr, ppallet, num_pl * 3);
|
218
|
+
if (b)
|
219
|
+
HPDF_Array_Add (array, b);
|
220
|
+
}
|
221
|
+
|
222
|
+
HPDF_FreeMem (image->mmgr, ppallet);
|
223
|
+
|
224
|
+
return image->error->error_no;
|
225
|
+
}
|
226
|
+
|
227
|
+
#define HPDF_PNG_BYTES_TO_CHECK 8
|
228
|
+
|
229
|
+
HPDF_Image
|
230
|
+
HPDF_Image_LoadPngImage (HPDF_MMgr mmgr,
|
231
|
+
HPDF_Stream png_data,
|
232
|
+
HPDF_Xref xref,
|
233
|
+
HPDF_BOOL delayed_loading)
|
234
|
+
{
|
235
|
+
HPDF_STATUS ret;
|
236
|
+
HPDF_Dict image;
|
237
|
+
png_byte header[HPDF_PNG_BYTES_TO_CHECK];
|
238
|
+
HPDF_UINT len = HPDF_PNG_BYTES_TO_CHECK;
|
239
|
+
|
240
|
+
HPDF_PTRACE ((" HPDF_Image_LoadPngImage\n"));
|
241
|
+
|
242
|
+
HPDF_MemSet (header, 0x00, HPDF_PNG_BYTES_TO_CHECK);
|
243
|
+
ret = HPDF_Stream_Read (png_data, header, &len);
|
244
|
+
if (ret != HPDF_OK ||
|
245
|
+
png_sig_cmp (header, (png_size_t)0, HPDF_PNG_BYTES_TO_CHECK)) {
|
246
|
+
HPDF_SetError (mmgr->error, HPDF_INVALID_PNG_IMAGE, 0);
|
247
|
+
return NULL;
|
248
|
+
}
|
249
|
+
|
250
|
+
image = HPDF_DictStream_New (mmgr, xref);
|
251
|
+
if (!image)
|
252
|
+
return NULL;
|
253
|
+
|
254
|
+
image->header.obj_class |= HPDF_OSUBCLASS_XOBJECT;
|
255
|
+
ret += HPDF_Dict_AddName (image, "Type", "XObject");
|
256
|
+
ret += HPDF_Dict_AddName (image, "Subtype", "Image");
|
257
|
+
if (ret != HPDF_OK)
|
258
|
+
return NULL;
|
259
|
+
|
260
|
+
if (LoadPngData (image, png_data, delayed_loading) != HPDF_OK)
|
261
|
+
return NULL;
|
262
|
+
|
263
|
+
return image;
|
264
|
+
}
|
265
|
+
|
266
|
+
|
267
|
+
static HPDF_STATUS
|
268
|
+
LoadPngData (HPDF_Dict image,
|
269
|
+
HPDF_Stream png_data,
|
270
|
+
HPDF_BOOL delayed_loading)
|
271
|
+
|
272
|
+
{
|
273
|
+
HPDF_STATUS ret;
|
274
|
+
png_structp png_ptr = NULL;
|
275
|
+
png_infop info_ptr = NULL;
|
276
|
+
|
277
|
+
HPDF_PTRACE ((" HPDF_Image_LoadPngImage\n"));
|
278
|
+
|
279
|
+
/* create read_struct. */
|
280
|
+
png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING,
|
281
|
+
image->error, PngErrorFunc, PngErrorFunc);
|
282
|
+
|
283
|
+
if (png_ptr == NULL) {
|
284
|
+
HPDF_SetError (image->error, HPDF_FAILD_TO_ALLOC_MEM, 0);
|
285
|
+
return HPDF_FAILD_TO_ALLOC_MEM;
|
286
|
+
}
|
287
|
+
|
288
|
+
/* create info-struct */
|
289
|
+
info_ptr = png_create_info_struct (png_ptr);
|
290
|
+
|
291
|
+
if (info_ptr == NULL) {
|
292
|
+
HPDF_SetError (image->error, HPDF_FAILD_TO_ALLOC_MEM, 0);
|
293
|
+
goto Exit;
|
294
|
+
}
|
295
|
+
|
296
|
+
png_set_sig_bytes (png_ptr, HPDF_PNG_BYTES_TO_CHECK);
|
297
|
+
png_set_read_fn (png_ptr, (void *)png_data, (png_rw_ptr)&PngReadFunc);
|
298
|
+
|
299
|
+
/* reading info structure. */
|
300
|
+
png_read_info(png_ptr, info_ptr);
|
301
|
+
if (image->error->error_no != HPDF_OK)
|
302
|
+
goto Exit;
|
303
|
+
|
304
|
+
/* 16bit image and alpha color type are not supported. */
|
305
|
+
if (info_ptr->bit_depth == 16)
|
306
|
+
png_set_strip_16(png_ptr);
|
307
|
+
|
308
|
+
if (PNG_COLOR_MASK_ALPHA & info_ptr->color_type) {
|
309
|
+
/* png image with alpha chanel is not supported. */
|
310
|
+
png_set_strip_alpha(png_ptr);
|
311
|
+
}
|
312
|
+
|
313
|
+
png_read_update_info(png_ptr, info_ptr);
|
314
|
+
if (image->error->error_no != HPDF_OK)
|
315
|
+
goto Exit;
|
316
|
+
|
317
|
+
/* if the image has color palette, copy the pallet of the image to
|
318
|
+
* create color map.
|
319
|
+
*/
|
320
|
+
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
|
321
|
+
ret = CreatePallet(image, png_ptr, info_ptr);
|
322
|
+
else if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY)
|
323
|
+
ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceGray");
|
324
|
+
else
|
325
|
+
ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceRGB");
|
326
|
+
|
327
|
+
if (ret != HPDF_OK)
|
328
|
+
goto Exit;
|
329
|
+
|
330
|
+
/* read image-data
|
331
|
+
* if the image is interlaced, read whole image at once.
|
332
|
+
* if delayed_loading is HPDF_TRUE, the data does not load this phase.
|
333
|
+
*/
|
334
|
+
if (delayed_loading) {
|
335
|
+
image->before_write_fn = PngBeforeWrite;
|
336
|
+
image->after_write_fn = PngAfterWrite;
|
337
|
+
} else {
|
338
|
+
if (png_get_interlace_type(png_ptr, info_ptr) != PNG_INTERLACE_NONE)
|
339
|
+
ret = ReadPngData_Interlaced(image, png_ptr, info_ptr);
|
340
|
+
else
|
341
|
+
ret = ReadPngData(image, png_ptr, info_ptr);
|
342
|
+
|
343
|
+
if (ret != HPDF_OK)
|
344
|
+
goto Exit;
|
345
|
+
}
|
346
|
+
|
347
|
+
/* setting the info of the image. */
|
348
|
+
if (HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)info_ptr->width)
|
349
|
+
!= HPDF_OK)
|
350
|
+
goto Exit;
|
351
|
+
|
352
|
+
if (HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)info_ptr->height)
|
353
|
+
!= HPDF_OK)
|
354
|
+
goto Exit;
|
355
|
+
|
356
|
+
if (HPDF_Dict_AddNumber (image, "BitsPerComponent",
|
357
|
+
(HPDF_UINT)info_ptr->bit_depth) != HPDF_OK)
|
358
|
+
goto Exit;
|
359
|
+
|
360
|
+
/* clean up */
|
361
|
+
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
362
|
+
|
363
|
+
return HPDF_OK;
|
364
|
+
|
365
|
+
Exit:
|
366
|
+
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
|
367
|
+
|
368
|
+
return image->error->error_no;
|
369
|
+
}
|
370
|
+
|
371
|
+
|
372
|
+
static HPDF_STATUS
|
373
|
+
PngBeforeWrite (HPDF_Dict obj)
|
374
|
+
{
|
375
|
+
HPDF_STATUS ret;
|
376
|
+
png_byte header[HPDF_PNG_BYTES_TO_CHECK];
|
377
|
+
HPDF_UINT len = HPDF_PNG_BYTES_TO_CHECK;
|
378
|
+
HPDF_Stream png_data;
|
379
|
+
HPDF_String s;
|
380
|
+
|
381
|
+
HPDF_PTRACE ((" PngBeforeWrite\n"));
|
382
|
+
|
383
|
+
HPDF_MemStream_FreeData(obj->stream);
|
384
|
+
|
385
|
+
s = HPDF_Dict_GetItem (obj, "_FILE_NAME", HPDF_OCLASS_STRING);
|
386
|
+
if (!s)
|
387
|
+
return HPDF_SetError (obj->error, HPDF_MISSING_FILE_NAME_ENTRY, 0);
|
388
|
+
|
389
|
+
png_data = HPDF_FileReader_New (obj->mmgr, s->value);
|
390
|
+
if (!HPDF_Stream_Validate (png_data))
|
391
|
+
return obj->error->error_no;
|
392
|
+
|
393
|
+
HPDF_MemSet (header, 0x00, HPDF_PNG_BYTES_TO_CHECK);
|
394
|
+
ret = HPDF_Stream_Read (png_data, header, &len);
|
395
|
+
if (ret != HPDF_OK ||
|
396
|
+
png_sig_cmp (header, (png_size_t)0, HPDF_PNG_BYTES_TO_CHECK)) {
|
397
|
+
HPDF_Stream_Free(png_data);
|
398
|
+
return HPDF_SetError (obj->error, HPDF_INVALID_PNG_IMAGE, 0);
|
399
|
+
}
|
400
|
+
|
401
|
+
if ((ret = LoadPngData (obj, png_data, HPDF_FALSE)) != HPDF_OK) {
|
402
|
+
HPDF_Stream_Free(png_data);
|
403
|
+
return ret;
|
404
|
+
}
|
405
|
+
|
406
|
+
HPDF_Stream_Free(png_data);
|
407
|
+
|
408
|
+
return HPDF_OK;
|
409
|
+
}
|
410
|
+
|
411
|
+
|
412
|
+
static HPDF_STATUS
|
413
|
+
PngAfterWrite (HPDF_Dict obj)
|
414
|
+
{
|
415
|
+
HPDF_PTRACE ((" PngAfterWrite\n"));
|
416
|
+
|
417
|
+
HPDF_MemStream_FreeData(obj->stream);
|
418
|
+
|
419
|
+
return HPDF_OK;
|
420
|
+
}
|
421
|
+
|
422
|
+
|
423
|
+
#endif /* HPDF_NOPNGLIB */
|
424
|
+
|
data/ext/hpdf_info.c
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
/*
|
2
|
+
* << Haru Free PDF Library 2.0.0 >> -- hpdf_info.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_info.h"
|
18
|
+
|
19
|
+
static const char *HPDF_INFO_ATTR_NAMES[] = {
|
20
|
+
"CreationDate",
|
21
|
+
"ModDate",
|
22
|
+
"Author",
|
23
|
+
"Creator",
|
24
|
+
"Producer",
|
25
|
+
"Title",
|
26
|
+
"Subject",
|
27
|
+
"Keywords",
|
28
|
+
NULL
|
29
|
+
};
|
30
|
+
|
31
|
+
|
32
|
+
static const char*
|
33
|
+
InfoTypeToName (HPDF_InfoType type);
|
34
|
+
|
35
|
+
|
36
|
+
/*---------------------------------------------------------------------------*/
|
37
|
+
|
38
|
+
static const char*
|
39
|
+
InfoTypeToName (HPDF_InfoType type)
|
40
|
+
{
|
41
|
+
HPDF_UINT idx = (HPDF_UINT)type;
|
42
|
+
|
43
|
+
return HPDF_INFO_ATTR_NAMES[idx];
|
44
|
+
}
|
45
|
+
|
46
|
+
|
47
|
+
HPDF_STATUS
|
48
|
+
HPDF_Info_SetInfoAttr (HPDF_Dict info,
|
49
|
+
HPDF_InfoType type,
|
50
|
+
const char *value,
|
51
|
+
HPDF_Encoder encoder)
|
52
|
+
{
|
53
|
+
const char* name = InfoTypeToName (type);
|
54
|
+
|
55
|
+
HPDF_PTRACE((" HPDF_Info_SetInfoAttr\n"));
|
56
|
+
|
57
|
+
if (type <= HPDF_INFO_MOD_DATE)
|
58
|
+
return HPDF_SetError (info->error, HPDF_INVALID_PARAMETER, 0);
|
59
|
+
|
60
|
+
return HPDF_Dict_Add (info, name, HPDF_String_New (info->mmgr, value,
|
61
|
+
encoder));
|
62
|
+
}
|
63
|
+
|
64
|
+
|
65
|
+
const char*
|
66
|
+
HPDF_Info_GetInfoAttr (HPDF_Dict info,
|
67
|
+
HPDF_InfoType type)
|
68
|
+
{
|
69
|
+
const char* name = InfoTypeToName (type);
|
70
|
+
HPDF_String s;
|
71
|
+
|
72
|
+
HPDF_PTRACE((" HPDF_Info_GetInfoAttr\n"));
|
73
|
+
|
74
|
+
if (!info)
|
75
|
+
return NULL;
|
76
|
+
|
77
|
+
s = HPDF_Dict_GetItem (info, name, HPDF_OCLASS_STRING);
|
78
|
+
|
79
|
+
if (!s)
|
80
|
+
return NULL;
|
81
|
+
else
|
82
|
+
return s->value;
|
83
|
+
}
|
84
|
+
|
85
|
+
|
86
|
+
HPDF_STATUS
|
87
|
+
HPDF_Info_SetInfoDateAttr (HPDF_Dict info,
|
88
|
+
HPDF_InfoType type,
|
89
|
+
HPDF_Date value)
|
90
|
+
{
|
91
|
+
char tmp[HPDF_DATE_TIME_STR_LEN + 1];
|
92
|
+
char* ptmp;
|
93
|
+
const char* name = InfoTypeToName (type);
|
94
|
+
|
95
|
+
HPDF_PTRACE((" HPDF_Info_SetInfoDateAttr\n"));
|
96
|
+
|
97
|
+
if (type > HPDF_INFO_MOD_DATE)
|
98
|
+
return HPDF_SetError (info->error, HPDF_INVALID_PARAMETER, 0);
|
99
|
+
|
100
|
+
HPDF_MemSet (tmp, 0, HPDF_DATE_TIME_STR_LEN + 1);
|
101
|
+
if (value.month < 1 || 12 < value.month ||
|
102
|
+
value.day < 1 ||
|
103
|
+
23 < value.hour ||
|
104
|
+
59 < value.minutes ||
|
105
|
+
59 < value.seconds ||
|
106
|
+
(value.ind != '+' && value.ind != '-' && value.ind != 'Z' &&
|
107
|
+
value.ind != ' ') ||
|
108
|
+
23 < value.off_hour ||
|
109
|
+
59 < value.off_minutes) {
|
110
|
+
return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0);
|
111
|
+
}
|
112
|
+
|
113
|
+
switch (value.month) {
|
114
|
+
case 1:
|
115
|
+
case 3:
|
116
|
+
case 5:
|
117
|
+
case 7:
|
118
|
+
case 8:
|
119
|
+
case 10:
|
120
|
+
case 12:
|
121
|
+
if (value.day > 31)
|
122
|
+
return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0);
|
123
|
+
|
124
|
+
break;
|
125
|
+
case 4:
|
126
|
+
case 6:
|
127
|
+
case 9:
|
128
|
+
case 11:
|
129
|
+
if (value.day > 30)
|
130
|
+
return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0);
|
131
|
+
|
132
|
+
break;
|
133
|
+
case 2:
|
134
|
+
if (value.day > 29 || (value.day == 29 &&
|
135
|
+
(value.year % 4 != 0 ||
|
136
|
+
(value.year % 100 == 0 && value.year % 400 != 0))))
|
137
|
+
return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0);
|
138
|
+
|
139
|
+
break;
|
140
|
+
default:
|
141
|
+
return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0);
|
142
|
+
}
|
143
|
+
|
144
|
+
ptmp = HPDF_MemCpy (tmp, "D:", 2);
|
145
|
+
ptmp = HPDF_IToA2 (ptmp, value.year, 5);
|
146
|
+
ptmp = HPDF_IToA2 (ptmp, value.month, 3);
|
147
|
+
ptmp = HPDF_IToA2 (ptmp, value.day, 3);
|
148
|
+
ptmp = HPDF_IToA2 (ptmp, value.hour, 3);
|
149
|
+
ptmp = HPDF_IToA2 (ptmp, value.minutes, 3);
|
150
|
+
ptmp = HPDF_IToA2 (ptmp, value.seconds, 3);
|
151
|
+
if (value.ind != ' ') {
|
152
|
+
*ptmp++ = value.ind;
|
153
|
+
ptmp = HPDF_IToA2 (ptmp, value.off_hour, 3);
|
154
|
+
*ptmp++ = '\'';
|
155
|
+
ptmp = HPDF_IToA2 (ptmp, value.off_minutes, 3);
|
156
|
+
*ptmp++ = '\'';
|
157
|
+
}
|
158
|
+
*ptmp = 0;
|
159
|
+
|
160
|
+
return HPDF_Dict_Add (info, name, HPDF_String_New (info->mmgr, tmp,
|
161
|
+
NULL));
|
162
|
+
}
|
163
|
+
|
164
|
+
|