UNPKG

15 kBtext/x-cView Raw
1/*
2 Source File : PDFPageDriver.cpp
3
4
5 Copyright 2013 Gal Kahana HummusJS
6
7 Licensed under the Apache License, Version 2.0 (the "License");
8 you may not use this file except in compliance with the License.
9 You may obtain a copy of the License at
10
11 http://www.apache.org/licenses/LICENSE-2.0
12
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18
19 */
20#include "PDFPageDriver.h"
21#include "PDFRectangle.h"
22#include "ResourcesDictionaryDriver.h"
23#include "ConstructorsHolder.h"
24
25using namespace v8;
26
27
28
29PDFPageDriver::~PDFPageDriver()
30{
31 if(mOwnsPage)
32 delete mPDFPage;
33}
34
35PDFPageDriver::PDFPageDriver()
36{
37 ContentContext = NULL;
38 mPDFPage = NULL;
39 mOwnsPage = false;
40}
41
42DEF_SUBORDINATE_INIT(PDFPageDriver::Init)
43{
44 CREATE_ISOLATE_CONTEXT;
45
46 Local<FunctionTemplate> t = NEW_FUNCTION_TEMPLATE_EXTERNAL(New);
47
48 t->SetClassName(NEW_STRING("PDFPage"));
49 t->InstanceTemplate()->SetInternalFieldCount(1);
50
51 SET_ACCESSOR_METHODS(t, "mediaBox", GetMediaBox, SetMediaBox);
52 SET_ACCESSOR_METHODS(t, "cropBox", GetCropBox, SetCropBox);
53 SET_ACCESSOR_METHODS(t, "bleedBox", GetBleedBox, SetBleedBox);
54 SET_ACCESSOR_METHODS(t, "trimBox", GetTrimBox, SetTrimBox);
55 SET_ACCESSOR_METHODS(t, "artBox", GetArtBox, SetArtBox);
56 SET_ACCESSOR_METHODS(t, "rotate",GetRotate, SetRotate);
57 SET_PROTOTYPE_METHOD(t, "getResourcesDictionary", GetResourcesDictionary);
58
59 SET_CONSTRUCTOR_EXPORT("PDFPage", t);
60
61 // save in factory
62 EXPOSE_EXTERNAL_FOR_INIT(ConstructorsHolder, holder)
63 SET_CONSTRUCTOR(holder->PDFPage_constructor, t);
64 SET_CONSTRUCTOR_TEMPLATE(holder->PDFPage_constructor_template, t);
65}
66
67METHOD_RETURN_TYPE PDFPageDriver::New(const ARGS_TYPE& args)
68{
69 CREATE_ISOLATE_CONTEXT;
70 CREATE_ESCAPABLE_SCOPE;
71 EXPOSE_EXTERNAL_ARGS(ConstructorsHolder, externalHolder)
72
73 PDFPageDriver* pdfPage = new PDFPageDriver();
74 if(args.Length() != 1) // which would signify that this didn't came from one of the "newinstance" here...so from user "new"
75 {
76 pdfPage->mPDFPage = new PDFPage();
77 pdfPage->mOwnsPage = true;
78
79 if(args.Length() == 4 && args[0]->IsNumber() && args[1]->IsNumber() && args[2]->IsNumber() && args[3]->IsNumber())
80 {
81 pdfPage->mPDFPage->SetMediaBox(PDFRectangle(TO_NUMBER(args[0])->Value(),
82 TO_NUMBER(args[1])->Value(),
83 TO_NUMBER(args[2])->Value(),
84 TO_NUMBER(args[3])->Value()));
85 }
86
87 }
88
89 pdfPage->holder = externalHolder;
90 pdfPage->Wrap(args.This());
91 SET_FUNCTION_RETURN_VALUE(args.This())
92}
93
94METHOD_RETURN_TYPE PDFPageDriver::GetMediaBox(Local<String> property, const PROPERTY_TYPE &info)
95{
96 CREATE_ISOLATE_CONTEXT;
97 CREATE_ESCAPABLE_SCOPE;
98
99 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
100
101 Local<Array> mediaBox = NEW_ARRAY(4);
102
103 mediaBox->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(pageDriver->mPDFPage->GetMediaBox().LowerLeftX));
104 mediaBox->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(pageDriver->mPDFPage->GetMediaBox().LowerLeftY));
105 mediaBox->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(pageDriver->mPDFPage->GetMediaBox().UpperRightX));
106 mediaBox->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(pageDriver->mPDFPage->GetMediaBox().UpperRightY));
107
108 SET_ACCESSOR_RETURN_VALUE(mediaBox)
109}
110
111METHOD_RETURN_TYPE PDFPageDriver::GetCropBox(Local<String> property, const PROPERTY_TYPE &info)
112{
113 CREATE_ISOLATE_CONTEXT;
114 CREATE_ESCAPABLE_SCOPE;
115
116 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
117
118 BoolAndPDFRectangle cropBox = pageDriver->mPDFPage->GetCropBox();
119
120 if(cropBox.first)
121 {
122 Local<Array> box = NEW_ARRAY(4);
123
124 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(cropBox.second.LowerLeftX));
125 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(cropBox.second.LowerLeftY));
126 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(cropBox.second.UpperRightX));
127 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(cropBox.second.UpperRightY));
128
129 SET_ACCESSOR_RETURN_VALUE(box)
130 }
131 else
132 {
133 SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
134 }
135}
136
137METHOD_RETURN_TYPE PDFPageDriver::GetBleedBox(Local<String> property, const PROPERTY_TYPE &info)
138{
139 CREATE_ISOLATE_CONTEXT;
140 CREATE_ESCAPABLE_SCOPE;
141
142 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
143
144 BoolAndPDFRectangle bleedBox = pageDriver->mPDFPage->GetBleedBox();
145
146 if(bleedBox.first)
147 {
148 Local<Array> box = NEW_ARRAY(4);
149
150 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(bleedBox.second.LowerLeftX));
151 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(bleedBox.second.LowerLeftY));
152 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(bleedBox.second.UpperRightX));
153 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(bleedBox.second.UpperRightY));
154
155 SET_ACCESSOR_RETURN_VALUE(box)
156 }
157 else
158 {
159 SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
160 }
161}
162
163METHOD_RETURN_TYPE PDFPageDriver::GetTrimBox(Local<String> property, const PROPERTY_TYPE &info)
164{
165 CREATE_ISOLATE_CONTEXT;
166 CREATE_ESCAPABLE_SCOPE;
167
168 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
169
170 BoolAndPDFRectangle trimBox = pageDriver->mPDFPage->GetTrimBox();
171
172 if(trimBox.first)
173 {
174 Local<Array> box = NEW_ARRAY(4);
175
176 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(trimBox.second.LowerLeftX));
177 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(trimBox.second.LowerLeftY));
178 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(trimBox.second.UpperRightX));
179 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(trimBox.second.UpperRightY));
180
181 SET_ACCESSOR_RETURN_VALUE(box)
182 }
183 else
184 {
185 SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
186 }
187}
188
189METHOD_RETURN_TYPE PDFPageDriver::GetArtBox(Local<String> property, const PROPERTY_TYPE &info)
190{
191 CREATE_ISOLATE_CONTEXT;
192 CREATE_ESCAPABLE_SCOPE;
193
194 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
195
196 BoolAndPDFRectangle artBox = pageDriver->mPDFPage->GetArtBox();
197
198 if(artBox.first)
199 {
200 Local<Array> box = NEW_ARRAY(4);
201
202 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(0),v8::NEW_NUMBER(artBox.second.LowerLeftX));
203 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(1),v8::NEW_NUMBER(artBox.second.LowerLeftY));
204 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(2),v8::NEW_NUMBER(artBox.second.UpperRightX));
205 box->Set(GET_CURRENT_CONTEXT, v8::NEW_NUMBER(3),v8::NEW_NUMBER(artBox.second.UpperRightY));
206
207 SET_ACCESSOR_RETURN_VALUE(box)
208 }
209 else
210 {
211 SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
212 }
213}
214
215void PDFPageDriver::SetMediaBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
216{
217 CREATE_ISOLATE_CONTEXT;
218 CREATE_ESCAPABLE_SCOPE;
219
220 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
221
222 if(!value->IsArray())
223 THROW_EXCEPTION("Media box is set to a value which is not a 4 numbers array");
224
225 if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
226 THROW_EXCEPTION("Media box is set to a value which is not a 4 numbers array");
227
228 pageDriver->mPDFPage->SetMediaBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
229 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
230 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
231 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
232
233}
234
235METHOD_RETURN_TYPE PDFPageDriver::GetRotate(Local<String> property, const PROPERTY_TYPE &info)
236{
237 CREATE_ISOLATE_CONTEXT;
238 CREATE_ESCAPABLE_SCOPE;
239
240 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
241
242 BoolAndInt rotate = pageDriver->mPDFPage->GetRotate();
243
244 if(rotate.first)
245 {
246 Local<Number> result = NEW_NUMBER(rotate.second);
247 SET_ACCESSOR_RETURN_VALUE(result)
248 }
249 else
250 {
251 SET_ACCESSOR_RETURN_VALUE(UNDEFINED)
252 }
253}
254
255void PDFPageDriver::SetRotate(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
256{
257 CREATE_ISOLATE_CONTEXT;
258 CREATE_ESCAPABLE_SCOPE;
259
260 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
261
262 if(!value->IsNumber())
263 THROW_EXCEPTION("Rotation is not set to a number");
264
265 pageDriver->mPDFPage->SetRotate(TO_UINT32(value)->Value());
266
267}
268
269
270void PDFPageDriver::SetCropBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
271{
272 CREATE_ISOLATE_CONTEXT;
273 CREATE_ESCAPABLE_SCOPE;
274
275 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
276
277 if(!value->IsArray())
278 THROW_EXCEPTION("Crop box is set to a value which is not a 4 numbers array");
279
280 if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
281 THROW_EXCEPTION("Crop box is set to a value which is not a 4 numbers array");
282
283 pageDriver->mPDFPage->SetCropBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
284 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
285 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
286 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
287
288}
289
290void PDFPageDriver::SetBleedBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
291{
292 CREATE_ISOLATE_CONTEXT;
293 CREATE_ESCAPABLE_SCOPE;
294
295 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
296
297 if(!value->IsArray())
298 THROW_EXCEPTION("Bleed box is set to a value which is not a 4 numbers array");
299
300 if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
301 THROW_EXCEPTION("Bleed box is set to a value which is not a 4 numbers array");
302
303 pageDriver->mPDFPage->SetBleedBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
304 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
305 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
306 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
307
308}
309
310void PDFPageDriver::SetTrimBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
311{
312 CREATE_ISOLATE_CONTEXT;
313 CREATE_ESCAPABLE_SCOPE;
314
315 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
316
317 if(!value->IsArray())
318 THROW_EXCEPTION("Trim box is set to a value which is not a 4 numbers array");
319
320 if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
321 THROW_EXCEPTION("Trim box is set to a value which is not a 4 numbers array");
322
323 pageDriver->mPDFPage->SetTrimBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
324 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
325 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
326 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
327
328}
329
330void PDFPageDriver::SetArtBox(Local<String> property, Local<Value> value, const PROPERTY_SETTER_TYPE &info)
331{
332 CREATE_ISOLATE_CONTEXT;
333 CREATE_ESCAPABLE_SCOPE;
334
335 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(info.Holder());
336
337 if(!value->IsArray())
338 THROW_EXCEPTION("Art box is set to a value which is not a 4 numbers array");
339
340 if(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, v8::NEW_STRING("length")).ToLocalChecked()->TO_UINT32Value() != 4)
341 THROW_EXCEPTION("Art box is set to a value which is not a 4 numbers array");
342
343 pageDriver->mPDFPage->SetArtBox(PDFRectangle(TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 0).ToLocalChecked())->Value(),
344 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 1).ToLocalChecked())->Value(),
345 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 2).ToLocalChecked())->Value(),
346 TO_NUMBER(value->TO_OBJECT()->Get(GET_CURRENT_CONTEXT, 3).ToLocalChecked())->Value()));
347
348}
349
350METHOD_RETURN_TYPE PDFPageDriver::GetResourcesDictionary(const ARGS_TYPE& args)
351{
352 CREATE_ISOLATE_CONTEXT;
353 CREATE_ESCAPABLE_SCOPE;
354 PDFPageDriver* pageDriver = ObjectWrap::Unwrap<PDFPageDriver>(args.This());
355
356 Local<Value> newInstance = pageDriver->holder->GetNewResourcesDictionary(args);
357 ResourcesDictionaryDriver* resourceDictionaryDriver = ObjectWrap::Unwrap<ResourcesDictionaryDriver>(newInstance->TO_OBJECT());
358 resourceDictionaryDriver->ResourcesDictionaryInstance = &(pageDriver->GetPage()->GetResourcesDictionary());
359
360 SET_FUNCTION_RETURN_VALUE(newInstance)
361}
362
363