wok-next annotate gambas2/stuff/CPdfDocument.cpp @ rev 18472
ghostscript, libv4l, slitaz-base-files: fix installation (thanks llev)
ghostscript: fix package upgrades;
libv4l: check multiple preloads in case of upgrade, not add preload if installation not finished/fails;
slitaz-base-files: not to overwrite real sudo.
ghostscript: fix package upgrades;
libv4l: check multiple preloads in case of upgrade, not add preload if installation not finished/fails;
slitaz-base-files: not to overwrite real sudo.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Mon Oct 05 01:10:26 2015 +0300 (2015-10-05) |
parents | |
children |
rev | line source |
---|---|
pascal@18440 | 1 /*************************************************************************** |
pascal@18440 | 2 |
pascal@18440 | 3 CPdfDocument.cpp |
pascal@18440 | 4 |
pascal@18440 | 5 gb.pdf Component |
pascal@18440 | 6 |
pascal@18440 | 7 (C) 2005-2007 Daniel Campos Fernández <dcamposf@gmail.com> |
pascal@18440 | 8 |
pascal@18440 | 9 |
pascal@18440 | 10 This program is free software; you can redistribute it and/or modify |
pascal@18440 | 11 it under the terms of the GNU General Public License as published by |
pascal@18440 | 12 the Free Software Foundation; either version 1, or (at your option) |
pascal@18440 | 13 any later version. |
pascal@18440 | 14 |
pascal@18440 | 15 This program is free software; you can redistribute it and/or modify |
pascal@18440 | 16 it under the terms of the GNU General Public License as published by |
pascal@18440 | 17 the Free Software Foundation; either version 1, or (at your option) |
pascal@18440 | 18 any later version. |
pascal@18440 | 19 |
pascal@18440 | 20 This program is distributed in the hope that it will be useful, |
pascal@18440 | 21 but WITHOUT ANY WARRANTY; without even the implied warranty of |
pascal@18440 | 22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
pascal@18440 | 23 GNU General Public License for more details. |
pascal@18440 | 24 |
pascal@18440 | 25 You should have received a copy of the GNU General Public License |
pascal@18440 | 26 along with this program; if not, write to the Free Software |
pascal@18440 | 27 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
pascal@18440 | 28 |
pascal@18440 | 29 ***************************************************************************/ |
pascal@18440 | 30 |
pascal@18440 | 31 #define __CPDFDOCUMENT_C |
pascal@18440 | 32 |
pascal@18440 | 33 #include "CPdfDocument.h" |
pascal@18440 | 34 |
pascal@18440 | 35 #include "gambas.h" |
pascal@18440 | 36 #include "main.h" |
pascal@18440 | 37 |
pascal@18440 | 38 #include <stdio.h> |
pascal@18440 | 39 #include <stdint.h> |
pascal@18440 | 40 #include <math.h> |
pascal@18440 | 41 |
pascal@18440 | 42 #include <PDFDoc.h> |
pascal@18440 | 43 #include <Stream.h> |
pascal@18440 | 44 #include <ErrorCodes.h> |
pascal@18440 | 45 #include <Page.h> |
pascal@18440 | 46 #include <Catalog.h> |
pascal@18440 | 47 #include <TextOutputDev.h> |
pascal@18440 | 48 #include <SplashOutputDev.h> |
pascal@18440 | 49 #include <splash/SplashBitmap.h> |
pascal@18440 | 50 #include <goo/GooList.h> |
pascal@18440 | 51 #include <Outline.h> |
pascal@18440 | 52 #include <Link.h> |
pascal@18440 | 53 #include <Gfx.h> |
pascal@18440 | 54 |
pascal@18440 | 55 /***************************************************************************** |
pascal@18440 | 56 |
pascal@18440 | 57 Translations from Poppler universe to Gambas universe |
pascal@18440 | 58 |
pascal@18440 | 59 ******************************************************************************/ |
pascal@18440 | 60 typedef struct |
pascal@18440 | 61 { |
pascal@18440 | 62 int32_t x0; |
pascal@18440 | 63 int32_t y0; |
pascal@18440 | 64 int32_t x1; |
pascal@18440 | 65 int32_t y1; |
pascal@18440 | 66 } FoundRect; |
pascal@18440 | 67 |
pascal@18440 | 68 static void aux_return_string_info(void *_object, const char *key) |
pascal@18440 | 69 { |
pascal@18440 | 70 Object obj; |
pascal@18440 | 71 Object dst; |
pascal@18440 | 72 GooString *goo_value; |
pascal@18440 | 73 Dict *info_dict; |
pascal@18440 | 74 char *tmpstr; |
pascal@18440 | 75 |
pascal@18440 | 76 THIS->doc->getDocInfo (&obj); |
pascal@18440 | 77 if (!obj.isDict()) { GB.ReturnNewZeroString(""); return; } |
pascal@18440 | 78 |
pascal@18440 | 79 info_dict=obj.getDict(); |
pascal@18440 | 80 info_dict->lookup ((char *)key, &dst); |
pascal@18440 | 81 if (!dst.isString ()) { GB.ReturnNewZeroString(""); } |
pascal@18440 | 82 else { |
pascal@18440 | 83 goo_value = dst.getString(); |
pascal@18440 | 84 |
pascal@18440 | 85 if (goo_value->hasUnicodeMarker()) |
pascal@18440 | 86 { |
pascal@18440 | 87 GB.ConvString (&tmpstr,goo_value->getCString()+2,goo_value->getLength()-2,"UTF-16BE","UTF-8"); |
pascal@18440 | 88 GB.ReturnNewZeroString(tmpstr); |
pascal@18440 | 89 } |
pascal@18440 | 90 else |
pascal@18440 | 91 GB.ReturnNewString(goo_value->getCString(),goo_value->getLength()); |
pascal@18440 | 92 } |
pascal@18440 | 93 dst.free(); |
pascal@18440 | 94 obj.free(); |
pascal@18440 | 95 } |
pascal@18440 | 96 |
pascal@18440 | 97 static void aux_return_date_info(void *_object, const char *key) |
pascal@18440 | 98 { |
pascal@18440 | 99 // TODO: Y2K effect |
pascal@18440 | 100 GB_DATE_SERIAL ds; |
pascal@18440 | 101 GB_DATE ret; |
pascal@18440 | 102 Object obj; |
pascal@18440 | 103 Object dst; |
pascal@18440 | 104 GooString *goo; |
pascal@18440 | 105 Dict *info_dict; |
pascal@18440 | 106 char *datestr=NULL,*tofree=NULL; |
pascal@18440 | 107 int nnum; |
pascal@18440 | 108 |
pascal@18440 | 109 THIS->doc->getDocInfo (&obj); |
pascal@18440 | 110 if (!obj.isDict()) { GB.ReturnNull(); return; } |
pascal@18440 | 111 |
pascal@18440 | 112 info_dict=obj.getDict(); |
pascal@18440 | 113 info_dict->lookup ((char *)key, &dst); |
pascal@18440 | 114 if (!dst.isString ()) { GB.ReturnNull(); } |
pascal@18440 | 115 else { |
pascal@18440 | 116 goo = dst.getString(); |
pascal@18440 | 117 if (goo->hasUnicodeMarker()) |
pascal@18440 | 118 GB.ConvString (&datestr,goo->getCString()+2,goo->getLength()-2,"UTF-16BE","UTF-8"); |
pascal@18440 | 119 else |
pascal@18440 | 120 { |
pascal@18440 | 121 GB.NewString(&datestr,goo->getCString(),goo->getLength()); |
pascal@18440 | 122 tofree=datestr; |
pascal@18440 | 123 } |
pascal@18440 | 124 |
pascal@18440 | 125 if (!datestr) { GB.ReturnNull(); } |
pascal@18440 | 126 else |
pascal@18440 | 127 { |
pascal@18440 | 128 if (datestr[0] == 'D' && datestr[1] == ':') datestr += 2; |
pascal@18440 | 129 nnum=sscanf(datestr, "%4hd%2hd%2hd%2hd%2hd%2hd",&ds.year, &ds.month, \ |
pascal@18440 | 130 &ds.day, &ds.hour, &ds.min, &ds.sec); |
pascal@18440 | 131 if (nnum != 6) { GB.ReturnNull(); } |
pascal@18440 | 132 else |
pascal@18440 | 133 { |
pascal@18440 | 134 if (GB.MakeDate(&ds,&ret)) |
pascal@18440 | 135 GB.ReturnNull(); |
pascal@18440 | 136 else |
pascal@18440 | 137 GB.ReturnDate(&ret); |
pascal@18440 | 138 } |
pascal@18440 | 139 } |
pascal@18440 | 140 |
pascal@18440 | 141 } |
pascal@18440 | 142 |
pascal@18440 | 143 if (tofree) GB.FreeString(&tofree); |
pascal@18440 | 144 dst.free(); |
pascal@18440 | 145 obj.free(); |
pascal@18440 | 146 } |
pascal@18440 | 147 |
pascal@18440 | 148 static void aux_return_unicode_string(Unicode *uni, int32_t len) |
pascal@18440 | 149 { |
pascal@18440 | 150 int32_t bc; |
pascal@18440 | 151 char *ret=NULL; |
pascal@18440 | 152 |
pascal@18440 | 153 for (bc=0; bc<len; bc++) |
pascal@18440 | 154 GB.AddString(&ret,(const char*)&uni[bc],0); |
pascal@18440 | 155 |
pascal@18440 | 156 GB.ReturnNewString(ret,0); |
pascal@18440 | 157 GB.FreeString(&ret); |
pascal@18440 | 158 } |
pascal@18440 | 159 |
pascal@18440 | 160 static LinkDest *get_dest(LinkAction *act) |
pascal@18440 | 161 { |
pascal@18440 | 162 switch (act->getKind()) |
pascal@18440 | 163 { |
pascal@18440 | 164 case actionGoTo: return ((LinkGoTo*)act)->getDest(); |
pascal@18440 | 165 case actionGoToR: return ((LinkGoToR*)act)->getDest(); |
pascal@18440 | 166 default: return 0; |
pascal@18440 | 167 } |
pascal@18440 | 168 } |
pascal@18440 | 169 |
pascal@18440 | 170 static uint32_t aux_get_page_from_action(void *_object, LinkAction *act) |
pascal@18440 | 171 { |
pascal@18440 | 172 Ref pref; |
pascal@18440 | 173 LinkDest *dest = get_dest(act); |
pascal@18440 | 174 #if POPPLER_VERSION_0_6 |
pascal@18440 | 175 GooString *name; |
pascal@18440 | 176 #else |
pascal@18440 | 177 UGooString *name; |
pascal@18440 | 178 #endif |
pascal@18440 | 179 |
pascal@18440 | 180 if (!dest) |
pascal@18440 | 181 { |
pascal@18440 | 182 // try to use NamedDest to get dest |
pascal@18440 | 183 if (!act) |
pascal@18440 | 184 return 0; |
pascal@18440 | 185 if (act->getKind () == actionGoTo) |
pascal@18440 | 186 { |
pascal@18440 | 187 name = ((LinkGoTo*)act)->getNamedDest(); |
pascal@18440 | 188 if (name) |
pascal@18440 | 189 dest = THIS->doc->findDest(name); |
pascal@18440 | 190 } |
pascal@18440 | 191 } |
pascal@18440 | 192 |
pascal@18440 | 193 if (!dest) |
pascal@18440 | 194 return 0; |
pascal@18440 | 195 |
pascal@18440 | 196 if (dest->isPageRef() ) |
pascal@18440 | 197 { |
pascal@18440 | 198 pref= dest->getPageRef(); |
pascal@18440 | 199 return THIS->doc->findPage(pref.num, pref.gen); |
pascal@18440 | 200 } |
pascal@18440 | 201 else |
pascal@18440 | 202 return dest->getPageNum(); |
pascal@18440 | 203 } |
pascal@18440 | 204 |
pascal@18440 | 205 static void aux_get_dimensions_from_action(LinkAction *act,int *left, int32_t *right, int32_t *top, int32_t *bottom) |
pascal@18440 | 206 { |
pascal@18440 | 207 LinkDest *dest = get_dest(act); |
pascal@18440 | 208 if (!dest) |
pascal@18440 | 209 { |
pascal@18440 | 210 if (left) *left=0; |
pascal@18440 | 211 if (right) *right=0; |
pascal@18440 | 212 if (top) *top=0; |
pascal@18440 | 213 if (bottom) *bottom=0; |
pascal@18440 | 214 return; |
pascal@18440 | 215 } |
pascal@18440 | 216 |
pascal@18440 | 217 if (left) *left=(int32_t)dest->getLeft(); |
pascal@18440 | 218 if (right) *right=(int32_t)dest->getRight(); |
pascal@18440 | 219 if (top) *top=(int32_t)dest->getTop(); |
pascal@18440 | 220 if (bottom) *bottom=(int32_t)dest->getBottom(); |
pascal@18440 | 221 } |
pascal@18440 | 222 |
pascal@18440 | 223 static double aux_get_zoom_from_action(LinkAction *act) |
pascal@18440 | 224 { |
pascal@18440 | 225 LinkDest *dest = get_dest(act); |
pascal@18440 | 226 if (dest) |
pascal@18440 | 227 return dest->getZoom(); |
pascal@18440 | 228 else |
pascal@18440 | 229 return 1; |
pascal@18440 | 230 } |
pascal@18440 | 231 |
pascal@18440 | 232 static char* aux_get_target_from_action(LinkAction *act) |
pascal@18440 | 233 { |
pascal@18440 | 234 char *vl=NULL; |
pascal@18440 | 235 char *uni=NULL; |
pascal@18440 | 236 GooString *tmp=NULL; |
pascal@18440 | 237 |
pascal@18440 | 238 switch (act->getKind()) |
pascal@18440 | 239 { |
pascal@18440 | 240 case actionGoToR: |
pascal@18440 | 241 tmp=((LinkGoToR*)act)->getFileName(); break; |
pascal@18440 | 242 |
pascal@18440 | 243 case actionLaunch: |
pascal@18440 | 244 tmp=((LinkLaunch*)act)->getFileName(); break; |
pascal@18440 | 245 |
pascal@18440 | 246 case actionURI: |
pascal@18440 | 247 tmp=((LinkURI*)act)->getURI(); break; |
pascal@18440 | 248 |
pascal@18440 | 249 case actionNamed: |
pascal@18440 | 250 tmp=((LinkNamed*)act)->getName(); break; |
pascal@18440 | 251 |
pascal@18440 | 252 case actionMovie: |
pascal@18440 | 253 #if POPPLER_VERSION_0_8 |
pascal@18440 | 254 tmp=((LinkMovie*)act)->getAnnotTitle(); break; |
pascal@18440 | 255 #else |
pascal@18440 | 256 tmp=((LinkMovie*)act)->getTitle(); break; |
pascal@18440 | 257 #endif |
pascal@18440 | 258 |
pascal@18440 | 259 default: |
pascal@18440 | 260 break; |
pascal@18440 | 261 } |
pascal@18440 | 262 |
pascal@18440 | 263 if (!tmp) return NULL; |
pascal@18440 | 264 |
pascal@18440 | 265 if (tmp->hasUnicodeMarker()) |
pascal@18440 | 266 { |
pascal@18440 | 267 GB.ConvString (&uni,tmp->getCString()+2,tmp->getLength()-2,"UTF-16BE","UTF-8"); |
pascal@18440 | 268 GB.AddString (&vl,uni,0); |
pascal@18440 | 269 } |
pascal@18440 | 270 else |
pascal@18440 | 271 GB.AddString(&vl,tmp->getCString(),tmp->getLength()); |
pascal@18440 | 272 |
pascal@18440 | 273 |
pascal@18440 | 274 return vl; |
pascal@18440 | 275 |
pascal@18440 | 276 } |
pascal@18440 | 277 |
pascal@18440 | 278 /***************************************************************************** |
pascal@18440 | 279 |
pascal@18440 | 280 PDF document |
pascal@18440 | 281 |
pascal@18440 | 282 ******************************************************************************/ |
pascal@18440 | 283 |
pascal@18440 | 284 |
pascal@18440 | 285 static void free_all(void *_object) |
pascal@18440 | 286 { |
pascal@18440 | 287 if (THIS->doc) |
pascal@18440 | 288 { |
pascal@18440 | 289 delete THIS->doc; |
pascal@18440 | 290 THIS->doc=NULL; |
pascal@18440 | 291 } |
pascal@18440 | 292 |
pascal@18440 | 293 if (THIS->dev) |
pascal@18440 | 294 { |
pascal@18440 | 295 delete THIS->dev; |
pascal@18440 | 296 THIS->dev=NULL; |
pascal@18440 | 297 } |
pascal@18440 | 298 |
pascal@18440 | 299 if (THIS->buf) |
pascal@18440 | 300 { |
pascal@18440 | 301 GB.ReleaseFile(&THIS->buf,THIS->len); |
pascal@18440 | 302 THIS->buf=NULL; |
pascal@18440 | 303 } |
pascal@18440 | 304 |
pascal@18440 | 305 if (THIS->Found) |
pascal@18440 | 306 { |
pascal@18440 | 307 GB.FreeArray(POINTER(&THIS->Found)); |
pascal@18440 | 308 THIS->Found=NULL; |
pascal@18440 | 309 } |
pascal@18440 | 310 |
pascal@18440 | 311 if (THIS->links) |
pascal@18440 | 312 { |
pascal@18440 | 313 delete THIS->links; |
pascal@18440 | 314 THIS->links=NULL; |
pascal@18440 | 315 } |
pascal@18440 | 316 |
pascal@18440 | 317 if (THIS->pindex) |
pascal@18440 | 318 { |
pascal@18440 | 319 GB.FreeArray(POINTER(&THIS->pindex)); |
pascal@18440 | 320 GB.FreeArray(POINTER(&THIS->oldindex)); |
pascal@18440 | 321 THIS->pindex=NULL; |
pascal@18440 | 322 THIS->oldindex=NULL; |
pascal@18440 | 323 } |
pascal@18440 | 324 |
pascal@18440 | 325 THIS->index=NULL; |
pascal@18440 | 326 THIS->currpage=-1; |
pascal@18440 | 327 } |
pascal@18440 | 328 |
pascal@18440 | 329 BEGIN_METHOD_VOID (PDFDOCUMENT_free) |
pascal@18440 | 330 |
pascal@18440 | 331 free_all(_object); |
pascal@18440 | 332 |
pascal@18440 | 333 END_METHOD |
pascal@18440 | 334 |
pascal@18440 | 335 BEGIN_PROPERTY(PDFDOCUMENT_scale) |
pascal@18440 | 336 |
pascal@18440 | 337 if (READ_PROPERTY){ GB.ReturnFloat(THIS->scale); return; } |
pascal@18440 | 338 |
pascal@18440 | 339 if (VPROP(GB_FLOAT)>0) { THIS->scale = VPROP(GB_FLOAT); return; } |
pascal@18440 | 340 |
pascal@18440 | 341 GB.Error("Zoom must be a positive value"); |
pascal@18440 | 342 |
pascal@18440 | 343 END_PROPERTY |
pascal@18440 | 344 |
pascal@18440 | 345 BEGIN_PROPERTY(PDFDOCUMENT_rotation) |
pascal@18440 | 346 |
pascal@18440 | 347 int32_t rot; |
pascal@18440 | 348 |
pascal@18440 | 349 if (READ_PROPERTY) |
pascal@18440 | 350 { |
pascal@18440 | 351 GB.ReturnInteger(THIS->rotation); |
pascal@18440 | 352 return; |
pascal@18440 | 353 } |
pascal@18440 | 354 |
pascal@18440 | 355 rot=VPROP(GB_INTEGER); |
pascal@18440 | 356 |
pascal@18440 | 357 while (rot<0) rot+=360; |
pascal@18440 | 358 while (rot>=360) rot-=360; |
pascal@18440 | 359 |
pascal@18440 | 360 switch (rot) |
pascal@18440 | 361 { |
pascal@18440 | 362 case 0: |
pascal@18440 | 363 case 90: |
pascal@18440 | 364 case 180: |
pascal@18440 | 365 case 270: |
pascal@18440 | 366 THIS->rotation = VPROP(GB_INTEGER); |
pascal@18440 | 367 break; |
pascal@18440 | 368 } |
pascal@18440 | 369 |
pascal@18440 | 370 END_PROPERTY |
pascal@18440 | 371 |
pascal@18440 | 372 |
pascal@18440 | 373 int32_t open_document (void *_object, char *sfile, int32_t lfile) |
pascal@18440 | 374 { |
pascal@18440 | 375 SplashColor white; |
pascal@18440 | 376 PDFDoc *test; |
pascal@18440 | 377 MemStream *stream; |
pascal@18440 | 378 Object obj; |
pascal@18440 | 379 Outline *outline; |
pascal@18440 | 380 char *buf=NULL; |
pascal@18440 | 381 int32_t len=0; |
pascal@18440 | 382 int32_t ret; |
pascal@18440 | 383 |
pascal@18440 | 384 |
pascal@18440 | 385 if ( GB.LoadFile(sfile,lfile,&buf,&len) ) return -1; |
pascal@18440 | 386 |
pascal@18440 | 387 obj.initNull(); |
pascal@18440 | 388 stream=new MemStream(buf,0,(Guint)len,&obj); |
pascal@18440 | 389 test=new PDFDoc (stream,0,0); |
pascal@18440 | 390 |
pascal@18440 | 391 if (!test->isOk()) |
pascal@18440 | 392 { |
pascal@18440 | 393 GB.ReleaseFile(&buf,len); |
pascal@18440 | 394 ret=test->getErrorCode(); |
pascal@18440 | 395 delete test; |
pascal@18440 | 396 test=NULL; |
pascal@18440 | 397 if (ret == errEncrypted) return -2; |
pascal@18440 | 398 return -3; |
pascal@18440 | 399 } |
pascal@18440 | 400 |
pascal@18440 | 401 free_all(_object); |
pascal@18440 | 402 |
pascal@18440 | 403 THIS->doc=test; |
pascal@18440 | 404 THIS->buf=buf; |
pascal@18440 | 405 THIS->len=len; |
pascal@18440 | 406 |
pascal@18440 | 407 white[0] = 0xFF; white[1] = 0xFF; white[2] = 0xFF; |
pascal@18440 | 408 THIS->dev=new SplashOutputDev(splashModeRGB8, 3, gFalse, white); |
pascal@18440 | 409 |
pascal@18440 | 410 #if POPPLER_VERSION_0_20 |
pascal@18440 | 411 THIS->dev->startDoc(THIS->doc); |
pascal@18440 | 412 #else |
pascal@18440 | 413 THIS->dev->startDoc(THIS->doc->getXRef ()); |
pascal@18440 | 414 #endif |
pascal@18440 | 415 |
pascal@18440 | 416 outline=THIS->doc->getOutline(); |
pascal@18440 | 417 if (outline) THIS->index=outline->getItems(); |
pascal@18440 | 418 |
pascal@18440 | 419 //if (THIS->index) |
pascal@18440 | 420 // if (!THIS->index->getLength()) THIS->index=NULL; |
pascal@18440 | 421 |
pascal@18440 | 422 THIS->currindex=0; |
pascal@18440 | 423 THIS->currpage=-1; |
pascal@18440 | 424 |
pascal@18440 | 425 return 0; |
pascal@18440 | 426 |
pascal@18440 | 427 } |
pascal@18440 | 428 |
pascal@18440 | 429 |
pascal@18440 | 430 BEGIN_METHOD(PDFDOCUMENT_new, GB_STRING File) |
pascal@18440 | 431 |
pascal@18440 | 432 THIS->scale = 1; |
pascal@18440 | 433 THIS->rotation = 0; |
pascal@18440 | 434 |
pascal@18440 | 435 if (!MISSING(File)) |
pascal@18440 | 436 { |
pascal@18440 | 437 switch (open_document( _object, STRING(File), LENGTH(File)) ) |
pascal@18440 | 438 { |
pascal@18440 | 439 case -1: GB.Error("File not found"); return; |
pascal@18440 | 440 case -2: GB.Error("PDF is encrypted"); return; |
pascal@18440 | 441 case -3: GB.Error("Bad PDF File"); return; |
pascal@18440 | 442 } |
pascal@18440 | 443 } |
pascal@18440 | 444 |
pascal@18440 | 445 END_METHOD |
pascal@18440 | 446 |
pascal@18440 | 447 BEGIN_METHOD (PDFDOCUMENT_open, GB_STRING File;) |
pascal@18440 | 448 |
pascal@18440 | 449 switch (open_document( _object, STRING(File), LENGTH(File)) ) |
pascal@18440 | 450 { |
pascal@18440 | 451 case -1: GB.Error("File not found"); return; |
pascal@18440 | 452 case -2: GB.Error("PDF is encrypted"); return; |
pascal@18440 | 453 case -3: GB.Error("Bad PDF File"); return; |
pascal@18440 | 454 } |
pascal@18440 | 455 |
pascal@18440 | 456 END_METHOD |
pascal@18440 | 457 |
pascal@18440 | 458 BEGIN_METHOD_VOID(PDFDOCUMENT_close) |
pascal@18440 | 459 |
pascal@18440 | 460 free_all(_object); |
pascal@18440 | 461 |
pascal@18440 | 462 END_METHOD |
pascal@18440 | 463 |
pascal@18440 | 464 BEGIN_METHOD(PDFDOCUMENT_get,GB_INTEGER index;) |
pascal@18440 | 465 |
pascal@18440 | 466 if (!THIS->doc || (VARG(index)<1) || ( VARG(index)>THIS->doc->getNumPages() ) ) |
pascal@18440 | 467 { |
pascal@18440 | 468 GB.Error("Invalid page number"); |
pascal@18440 | 469 GB.ReturnNull(); |
pascal@18440 | 470 return; |
pascal@18440 | 471 } |
pascal@18440 | 472 |
pascal@18440 | 473 if (THIS->currpage != (uint32_t)VARG(index) ) |
pascal@18440 | 474 { |
pascal@18440 | 475 if (THIS->Found) |
pascal@18440 | 476 { |
pascal@18440 | 477 GB.FreeArray(POINTER(&THIS->Found)); |
pascal@18440 | 478 THIS->Found=NULL; |
pascal@18440 | 479 } |
pascal@18440 | 480 |
pascal@18440 | 481 if (THIS->links) |
pascal@18440 | 482 { |
pascal@18440 | 483 delete THIS->links; |
pascal@18440 | 484 THIS->links=NULL; |
pascal@18440 | 485 } |
pascal@18440 | 486 |
pascal@18440 | 487 THIS->page=THIS->doc->getCatalog()->getPage(VARG(index)); |
pascal@18440 | 488 THIS->currpage=VARG(index); |
pascal@18440 | 489 } |
pascal@18440 | 490 |
pascal@18440 | 491 RETURN_SELF(); |
pascal@18440 | 492 |
pascal@18440 | 493 END_METHOD |
pascal@18440 | 494 |
pascal@18440 | 495 BEGIN_PROPERTY(PDFDOCUMENT_ready) |
pascal@18440 | 496 |
pascal@18440 | 497 GB.ReturnBoolean( (bool)THIS->doc ); |
pascal@18440 | 498 |
pascal@18440 | 499 END_PROPERTY |
pascal@18440 | 500 |
pascal@18440 | 501 BEGIN_PROPERTY(PDFDOCUMENT_count) |
pascal@18440 | 502 |
pascal@18440 | 503 GB.ReturnInteger( (int32_t) (THIS->doc ? THIS->doc->getNumPages() : 0)); |
pascal@18440 | 504 |
pascal@18440 | 505 END_PROPERTY |
pascal@18440 | 506 |
pascal@18440 | 507 BEGIN_PROPERTY(PDFDOCUMENT_info) |
pascal@18440 | 508 |
pascal@18440 | 509 if (THIS->doc) RETURN_SELF(); |
pascal@18440 | 510 else GB.ReturnNull(); |
pascal@18440 | 511 |
pascal@18440 | 512 END_PROPERTY |
pascal@18440 | 513 |
pascal@18440 | 514 /***************************************************************************** |
pascal@18440 | 515 |
pascal@18440 | 516 PDF document information |
pascal@18440 | 517 |
pascal@18440 | 518 ******************************************************************************/ |
pascal@18440 | 519 |
pascal@18440 | 520 BEGIN_PROPERTY(PDFINFO_title) |
pascal@18440 | 521 |
pascal@18440 | 522 aux_return_string_info(_object,"Title"); |
pascal@18440 | 523 |
pascal@18440 | 524 END_PROPERTY |
pascal@18440 | 525 |
pascal@18440 | 526 BEGIN_PROPERTY(PDFINFO_format) |
pascal@18440 | 527 |
pascal@18440 | 528 char ctx[16]; |
pascal@18440 | 529 #if POPPLER_VERSION_0_11_3 |
pascal@18440 | 530 snprintf(ctx, sizeof(ctx), "%.2g", THIS->doc->getPDFMajorVersion () + THIS->doc->getPDFMinorVersion() / 10.0); |
pascal@18440 | 531 #else |
pascal@18440 | 532 snprintf(ctx, sizeof(ctx), "%.2g", THIS->doc->getPDFVersion()); |
pascal@18440 | 533 #endif |
pascal@18440 | 534 GB.ReturnNewZeroString(ctx); |
pascal@18440 | 535 |
pascal@18440 | 536 END_PROPERTY |
pascal@18440 | 537 |
pascal@18440 | 538 BEGIN_PROPERTY(PDFINFO_author) |
pascal@18440 | 539 |
pascal@18440 | 540 aux_return_string_info(_object,"Author"); |
pascal@18440 | 541 |
pascal@18440 | 542 END_PROPERTY |
pascal@18440 | 543 |
pascal@18440 | 544 BEGIN_PROPERTY(PDFINFO_subject) |
pascal@18440 | 545 |
pascal@18440 | 546 aux_return_string_info(_object,"Subject"); |
pascal@18440 | 547 |
pascal@18440 | 548 END_PROPERTY |
pascal@18440 | 549 |
pascal@18440 | 550 BEGIN_PROPERTY(PDFINFO_keywords) |
pascal@18440 | 551 |
pascal@18440 | 552 aux_return_string_info(_object,"Keywords"); |
pascal@18440 | 553 |
pascal@18440 | 554 END_PROPERTY |
pascal@18440 | 555 |
pascal@18440 | 556 BEGIN_PROPERTY(PDFINFO_creator) |
pascal@18440 | 557 |
pascal@18440 | 558 aux_return_string_info(_object,"Creator"); |
pascal@18440 | 559 |
pascal@18440 | 560 END_PROPERTY |
pascal@18440 | 561 |
pascal@18440 | 562 BEGIN_PROPERTY(PDFINFO_producer) |
pascal@18440 | 563 |
pascal@18440 | 564 aux_return_string_info(_object,"Producer"); |
pascal@18440 | 565 |
pascal@18440 | 566 END_PROPERTY |
pascal@18440 | 567 |
pascal@18440 | 568 BEGIN_PROPERTY(PDFINFO_linearized) |
pascal@18440 | 569 |
pascal@18440 | 570 GB.ReturnBoolean(THIS->doc->isLinearized()); |
pascal@18440 | 571 |
pascal@18440 | 572 END_PROPERTY |
pascal@18440 | 573 |
pascal@18440 | 574 BEGIN_PROPERTY(PDFINFO_layout) |
pascal@18440 | 575 |
pascal@18440 | 576 Catalog *catalog; |
pascal@18440 | 577 |
pascal@18440 | 578 catalog=THIS->doc->getCatalog(); |
pascal@18440 | 579 if (!catalog) { GB.ReturnInteger(Catalog::pageLayoutNone); return; } |
pascal@18440 | 580 if (!catalog->isOk()) { GB.ReturnInteger(Catalog::pageLayoutNone); return; } |
pascal@18440 | 581 |
pascal@18440 | 582 GB.ReturnInteger(catalog->getPageLayout()); |
pascal@18440 | 583 |
pascal@18440 | 584 END_PROPERTY |
pascal@18440 | 585 |
pascal@18440 | 586 BEGIN_PROPERTY(PDFINFO_mode) |
pascal@18440 | 587 |
pascal@18440 | 588 Catalog *catalog; |
pascal@18440 | 589 |
pascal@18440 | 590 catalog=THIS->doc->getCatalog(); |
pascal@18440 | 591 if (!catalog) { GB.ReturnInteger(Catalog::pageModeNone); return; } |
pascal@18440 | 592 if (!catalog->isOk()) { GB.ReturnInteger(Catalog::pageModeNone); return; } |
pascal@18440 | 593 |
pascal@18440 | 594 GB.ReturnInteger(catalog->getPageMode()); |
pascal@18440 | 595 |
pascal@18440 | 596 |
pascal@18440 | 597 END_PROPERTY |
pascal@18440 | 598 |
pascal@18440 | 599 BEGIN_PROPERTY(PDFINFO_canprint) |
pascal@18440 | 600 |
pascal@18440 | 601 GB.ReturnBoolean(THIS->doc->okToPrint()); |
pascal@18440 | 602 |
pascal@18440 | 603 END_PROPERTY |
pascal@18440 | 604 |
pascal@18440 | 605 BEGIN_PROPERTY(PDFINFO_canmodify) |
pascal@18440 | 606 |
pascal@18440 | 607 GB.ReturnBoolean(THIS->doc->okToChange()); |
pascal@18440 | 608 |
pascal@18440 | 609 END_PROPERTY |
pascal@18440 | 610 |
pascal@18440 | 611 BEGIN_PROPERTY(PDFINFO_cancopy) |
pascal@18440 | 612 |
pascal@18440 | 613 GB.ReturnBoolean(THIS->doc->okToCopy()); |
pascal@18440 | 614 |
pascal@18440 | 615 END_PROPERTY |
pascal@18440 | 616 |
pascal@18440 | 617 BEGIN_PROPERTY(PDFINFO_canaddnotes) |
pascal@18440 | 618 |
pascal@18440 | 619 GB.ReturnBoolean(THIS->doc->okToAddNotes()); |
pascal@18440 | 620 |
pascal@18440 | 621 END_PROPERTY |
pascal@18440 | 622 |
pascal@18440 | 623 BEGIN_PROPERTY(PDFINFO_creation) |
pascal@18440 | 624 |
pascal@18440 | 625 aux_return_date_info(_object,"CreationDate"); |
pascal@18440 | 626 |
pascal@18440 | 627 END_PROPERTY |
pascal@18440 | 628 |
pascal@18440 | 629 BEGIN_PROPERTY(PDFINFO_modification) |
pascal@18440 | 630 |
pascal@18440 | 631 aux_return_date_info(_object,"ModDate"); |
pascal@18440 | 632 |
pascal@18440 | 633 END_PROPERTY |
pascal@18440 | 634 |
pascal@18440 | 635 |
pascal@18440 | 636 /***************************************************************************** |
pascal@18440 | 637 |
pascal@18440 | 638 PDF document index |
pascal@18440 | 639 |
pascal@18440 | 640 ******************************************************************************/ |
pascal@18440 | 641 |
pascal@18440 | 642 |
pascal@18440 | 643 BEGIN_PROPERTY(PDFDOCUMENT_has_index) |
pascal@18440 | 644 |
pascal@18440 | 645 GB.ReturnBoolean(THIS->index && THIS->index->getLength()); |
pascal@18440 | 646 |
pascal@18440 | 647 END_PROPERTY |
pascal@18440 | 648 |
pascal@18440 | 649 BEGIN_PROPERTY(PDFDOCUMENT_index) |
pascal@18440 | 650 |
pascal@18440 | 651 if (!THIS->index) { GB.ReturnNull(); return; } |
pascal@18440 | 652 |
pascal@18440 | 653 THIS->action=((OutlineItem*)THIS->index->get(THIS->currindex))->getAction(); |
pascal@18440 | 654 RETURN_SELF(); |
pascal@18440 | 655 |
pascal@18440 | 656 END_PROPERTY |
pascal@18440 | 657 |
pascal@18440 | 658 BEGIN_PROPERTY(PDFINDEX_count) |
pascal@18440 | 659 |
pascal@18440 | 660 GB.ReturnInteger(THIS->index->getLength()); |
pascal@18440 | 661 |
pascal@18440 | 662 END_PROPERTY |
pascal@18440 | 663 |
pascal@18440 | 664 BEGIN_PROPERTY(PDFINDEX_has_children) |
pascal@18440 | 665 |
pascal@18440 | 666 OutlineItem *item; |
pascal@18440 | 667 |
pascal@18440 | 668 item = (OutlineItem *)THIS->index->get (THIS->currindex); |
pascal@18440 | 669 GB.ReturnBoolean(item->getKids() && item->getKids()->getLength()); |
pascal@18440 | 670 |
pascal@18440 | 671 END_PROPERTY |
pascal@18440 | 672 |
pascal@18440 | 673 BEGIN_PROPERTY(PDFINDEX_is_open) |
pascal@18440 | 674 |
pascal@18440 | 675 OutlineItem *item; |
pascal@18440 | 676 |
pascal@18440 | 677 item = (OutlineItem *)THIS->index->get (THIS->currindex); |
pascal@18440 | 678 |
pascal@18440 | 679 if (READ_PROPERTY) |
pascal@18440 | 680 { GB.ReturnBoolean(item->isOpen()); return; } |
pascal@18440 | 681 |
pascal@18440 | 682 if (VPROP(GB_INTEGER)) item->open(); |
pascal@18440 | 683 else item->close(); |
pascal@18440 | 684 |
pascal@18440 | 685 END_PROPERTY |
pascal@18440 | 686 |
pascal@18440 | 687 BEGIN_PROPERTY(PDFINDEX_title) |
pascal@18440 | 688 |
pascal@18440 | 689 OutlineItem *item; |
pascal@18440 | 690 |
pascal@18440 | 691 item = (OutlineItem *)THIS->index->get (THIS->currindex); |
pascal@18440 | 692 aux_return_unicode_string(item->getTitle(),item->getTitleLength()); |
pascal@18440 | 693 |
pascal@18440 | 694 END_PROPERTY |
pascal@18440 | 695 |
pascal@18440 | 696 |
pascal@18440 | 697 BEGIN_METHOD_VOID(PDFINDEX_root) |
pascal@18440 | 698 |
pascal@18440 | 699 Outline *outline; |
pascal@18440 | 700 |
pascal@18440 | 701 outline=THIS->doc->getOutline(); |
pascal@18440 | 702 if (outline) THIS->index=outline->getItems(); |
pascal@18440 | 703 THIS->currindex=0; |
pascal@18440 | 704 if (THIS->pindex) { GB.FreeArray(POINTER(&THIS->pindex)); THIS->pindex=NULL; } |
pascal@18440 | 705 if (THIS->oldindex) { GB.FreeArray(POINTER(&THIS->oldindex)); THIS->oldindex=NULL; } |
pascal@18440 | 706 |
pascal@18440 | 707 END_METHOD |
pascal@18440 | 708 |
pascal@18440 | 709 BEGIN_METHOD_VOID(PDFINDEX_prev) |
pascal@18440 | 710 |
pascal@18440 | 711 if (!THIS->currindex) { GB.ReturnBoolean(true); return; } |
pascal@18440 | 712 |
pascal@18440 | 713 THIS->currindex--; |
pascal@18440 | 714 GB.ReturnBoolean(false); |
pascal@18440 | 715 |
pascal@18440 | 716 END_METHOD |
pascal@18440 | 717 |
pascal@18440 | 718 BEGIN_METHOD_VOID(PDFINDEX_next) |
pascal@18440 | 719 |
pascal@18440 | 720 if ( (THIS->currindex+1) >= (uint32_t)THIS->index->getLength() ) |
pascal@18440 | 721 { GB.ReturnBoolean(true); return; } |
pascal@18440 | 722 |
pascal@18440 | 723 THIS->currindex++; |
pascal@18440 | 724 GB.ReturnBoolean(false); |
pascal@18440 | 725 |
pascal@18440 | 726 END_METHOD |
pascal@18440 | 727 |
pascal@18440 | 728 BEGIN_METHOD_VOID(PDFINDEX_child) |
pascal@18440 | 729 |
pascal@18440 | 730 OutlineItem *item; |
pascal@18440 | 731 |
pascal@18440 | 732 item = (OutlineItem *)THIS->index->get (THIS->currindex); |
pascal@18440 | 733 |
pascal@18440 | 734 if (!item->hasKids() || item->getKids()->getLength() == 0) { GB.ReturnBoolean(true); return; } |
pascal@18440 | 735 |
pascal@18440 | 736 if (THIS->pindex) |
pascal@18440 | 737 { |
pascal@18440 | 738 GB.Add(POINTER(&THIS->pindex)); |
pascal@18440 | 739 GB.Add(POINTER(&THIS->oldindex)); |
pascal@18440 | 740 } |
pascal@18440 | 741 else |
pascal@18440 | 742 { |
pascal@18440 | 743 GB.NewArray(POINTER(&THIS->pindex),sizeof(void*),1); |
pascal@18440 | 744 GB.NewArray(POINTER(&THIS->oldindex),sizeof(uint32_t),1); |
pascal@18440 | 745 } |
pascal@18440 | 746 |
pascal@18440 | 747 if (!item->isOpen()) item->open(); |
pascal@18440 | 748 THIS->pindex[GB.Count(POINTER(THIS->pindex))-1]=(void*)THIS->index; |
pascal@18440 | 749 THIS->oldindex[GB.Count(POINTER(THIS->pindex))-1]=THIS->currindex; |
pascal@18440 | 750 THIS->index=item->getKids(); |
pascal@18440 | 751 THIS->currindex=0; |
pascal@18440 | 752 |
pascal@18440 | 753 GB.ReturnBoolean(false); |
pascal@18440 | 754 |
pascal@18440 | 755 END_METHOD |
pascal@18440 | 756 |
pascal@18440 | 757 BEGIN_METHOD_VOID(PDFINDEX_parent) |
pascal@18440 | 758 |
pascal@18440 | 759 if (!THIS->pindex) { GB.ReturnBoolean(true); return; } |
pascal@18440 | 760 |
pascal@18440 | 761 THIS->index=(GooList*)THIS->pindex[GB.Count(POINTER(THIS->pindex))-1]; |
pascal@18440 | 762 THIS->currindex=THIS->oldindex[GB.Count(POINTER(THIS->pindex))-1]; |
pascal@18440 | 763 if (GB.Count(POINTER(THIS->pindex))==1) |
pascal@18440 | 764 { |
pascal@18440 | 765 GB.FreeArray(POINTER(&THIS->pindex)); |
pascal@18440 | 766 GB.FreeArray(POINTER(&THIS->oldindex)); |
pascal@18440 | 767 THIS->oldindex=NULL; |
pascal@18440 | 768 THIS->pindex=NULL; |
pascal@18440 | 769 } |
pascal@18440 | 770 else |
pascal@18440 | 771 { |
pascal@18440 | 772 GB.Remove(POINTER(&THIS->pindex),GB.Count(POINTER(THIS->pindex))-1,1); |
pascal@18440 | 773 GB.Remove(POINTER(&THIS->oldindex),GB.Count(POINTER(THIS->oldindex))-1,1); |
pascal@18440 | 774 } |
pascal@18440 | 775 |
pascal@18440 | 776 GB.ReturnBoolean(false); |
pascal@18440 | 777 |
pascal@18440 | 778 END_METHOD |
pascal@18440 | 779 |
pascal@18440 | 780 /***************************************************************************** |
pascal@18440 | 781 |
pascal@18440 | 782 PDF pages |
pascal@18440 | 783 |
pascal@18440 | 784 ******************************************************************************/ |
pascal@18440 | 785 |
pascal@18440 | 786 BEGIN_PROPERTY (PDFPAGE_width) |
pascal@18440 | 787 |
pascal@18440 | 788 if ( (THIS->rotation==90) || (THIS->rotation==270) ) |
pascal@18440 | 789 GB.ReturnInteger((int32_t)(THIS->page->getMediaHeight()*THIS->scale)); |
pascal@18440 | 790 else |
pascal@18440 | 791 GB.ReturnInteger((int32_t)(THIS->page->getMediaWidth()*THIS->scale)); |
pascal@18440 | 792 |
pascal@18440 | 793 END_PROPERTY |
pascal@18440 | 794 |
pascal@18440 | 795 BEGIN_PROPERTY (PDFPAGE_height) |
pascal@18440 | 796 |
pascal@18440 | 797 if ( (THIS->rotation==90) || (THIS->rotation==270) ) |
pascal@18440 | 798 GB.ReturnInteger((int32_t)(THIS->page->getMediaWidth()*THIS->scale)); |
pascal@18440 | 799 else |
pascal@18440 | 800 GB.ReturnInteger((int32_t)(THIS->page->getMediaHeight()*THIS->scale)); |
pascal@18440 | 801 |
pascal@18440 | 802 END_PROPERTY |
pascal@18440 | 803 |
pascal@18440 | 804 static uint32_t *get_page_data(CPDFDOCUMENT *_object, int32_t x, int32_t y, int32_t *width, int32_t *height, double scale, int32_t rotation) |
pascal@18440 | 805 { |
pascal@18440 | 806 SplashBitmap *map; |
pascal@18440 | 807 uint32_t *data; |
pascal@18440 | 808 int32_t w, h; |
pascal@18440 | 809 int32_t rw; |
pascal@18440 | 810 int32_t rh; |
pascal@18440 | 811 |
pascal@18440 | 812 if ( (THIS->rotation==90) || (THIS->rotation==270) ) |
pascal@18440 | 813 { |
pascal@18440 | 814 rh=(int32_t)(THIS->page->getMediaWidth()*THIS->scale); |
pascal@18440 | 815 rw=(int32_t)(THIS->page->getMediaHeight()*THIS->scale); |
pascal@18440 | 816 } |
pascal@18440 | 817 else |
pascal@18440 | 818 { |
pascal@18440 | 819 rw=(int32_t)(THIS->page->getMediaWidth()*THIS->scale); |
pascal@18440 | 820 rh=(int32_t)(THIS->page->getMediaHeight()*THIS->scale); |
pascal@18440 | 821 } |
pascal@18440 | 822 |
pascal@18440 | 823 w = *width; |
pascal@18440 | 824 h = *height; |
pascal@18440 | 825 |
pascal@18440 | 826 if (w < 0) w = rw; |
pascal@18440 | 827 if (h < 0) h = rh; |
pascal@18440 | 828 |
pascal@18440 | 829 if (x<0) x=0; |
pascal@18440 | 830 if (y<0) y=0; |
pascal@18440 | 831 if (w<1) w=1; |
pascal@18440 | 832 if (h<1) h=1; |
pascal@18440 | 833 |
pascal@18440 | 834 |
pascal@18440 | 835 if ( (x+w) > rw ) w=rw-x; |
pascal@18440 | 836 if ( (y+h) > rh ) h=rh-y; |
pascal@18440 | 837 |
pascal@18440 | 838 if ( (w<0) || (h<0) ) return NULL; |
pascal@18440 | 839 |
pascal@18440 | 840 #if POPPLER_VERSION_0_20 |
pascal@18440 | 841 THIS->page->displaySlice(THIS->dev,72.0*scale,72.0*scale, |
pascal@18440 | 842 rotation, |
pascal@18440 | 843 gFalse, |
pascal@18440 | 844 gTrue, |
pascal@18440 | 845 x,y,w,h, |
pascal@18440 | 846 gFalse); |
pascal@18440 | 847 #else |
pascal@18440 | 848 THIS->page->displaySlice(THIS->dev,72.0*scale,72.0*scale, |
pascal@18440 | 849 rotation, |
pascal@18440 | 850 gFalse, |
pascal@18440 | 851 gTrue, |
pascal@18440 | 852 x,y,w,h, |
pascal@18440 | 853 gFalse, |
pascal@18440 | 854 THIS->doc->getCatalog ()); |
pascal@18440 | 855 #endif |
pascal@18440 | 856 |
pascal@18440 | 857 map=THIS->dev->getBitmap(); |
pascal@18440 | 858 |
pascal@18440 | 859 data=(uint32_t*)map->getDataPtr(); |
pascal@18440 | 860 |
pascal@18440 | 861 |
pascal@18440 | 862 *width = w; |
pascal@18440 | 863 *height = h; |
pascal@18440 | 864 |
pascal@18440 | 865 return data; |
pascal@18440 | 866 } |
pascal@18440 | 867 |
pascal@18440 | 868 BEGIN_METHOD(PDFPAGE_image, GB_INTEGER x; GB_INTEGER y; GB_INTEGER w; GB_INTEGER h) |
pascal@18440 | 869 |
pascal@18440 | 870 GB_IMAGE img = NULL; |
pascal@18440 | 871 uint32_t *data; |
pascal@18440 | 872 int32_t x,y, w, h; |
pascal@18440 | 873 |
pascal@18440 | 874 x = VARGOPT(x, 0); |
pascal@18440 | 875 y = VARGOPT(y, 0); |
pascal@18440 | 876 w = VARGOPT(w, -1); |
pascal@18440 | 877 h = VARGOPT(h, -1); |
pascal@18440 | 878 |
pascal@18440 | 879 data = get_page_data(THIS, x, y, &w, &h, THIS->scale, THIS->rotation); |
pascal@18440 | 880 if (!data) { GB.ReturnNull(); return; } |
pascal@18440 | 881 GB.Image.Create(&img, data, w, h, GB_IMAGE_RGB); |
pascal@18440 | 882 GB.ReturnObject(img); |
pascal@18440 | 883 |
pascal@18440 | 884 END_METHOD |
pascal@18440 | 885 |
pascal@18440 | 886 BEGIN_PROPERTY (PDFPAGE_property_image) |
pascal@18440 | 887 |
pascal@18440 | 888 int32_t w=-1; |
pascal@18440 | 889 int32_t h=-1; |
pascal@18440 | 890 GB_IMAGE img = NULL; |
pascal@18440 | 891 uint32_t *data; |
pascal@18440 | 892 |
pascal@18440 | 893 data = get_page_data(THIS, 0, 0, &w, &h, THIS->scale, THIS->rotation); |
pascal@18440 | 894 if (!data) { GB.ReturnNull(); return; } |
pascal@18440 | 895 GB.Image.Create(&img, data, w, h, GB_IMAGE_RGB); |
pascal@18440 | 896 GB.ReturnObject(img); |
pascal@18440 | 897 |
pascal@18440 | 898 END_PROPERTY |
pascal@18440 | 899 |
pascal@18440 | 900 |
pascal@18440 | 901 BEGIN_METHOD(PDFPAGE_picture, GB_INTEGER x; GB_INTEGER y; GB_INTEGER w; GB_INTEGER h) |
pascal@18440 | 902 |
pascal@18440 | 903 GB_IMAGE img = NULL; |
pascal@18440 | 904 uint32_t *data; |
pascal@18440 | 905 int32_t x,y, w, h; |
pascal@18440 | 906 |
pascal@18440 | 907 x = VARGOPT(x, 0); |
pascal@18440 | 908 y = VARGOPT(y, 0); |
pascal@18440 | 909 w = VARGOPT(w, -1); |
pascal@18440 | 910 h = VARGOPT(h, -1); |
pascal@18440 | 911 |
pascal@18440 | 912 data = get_page_data(THIS, x, y, &w, &h, THIS->scale, THIS->rotation); |
pascal@18440 | 913 if (!data) { GB.ReturnNull(); return; } |
pascal@18440 | 914 GB.Picture.Create(&img, data, w, h, GB_IMAGE_RGB); |
pascal@18440 | 915 GB.ReturnObject(img); |
pascal@18440 | 916 |
pascal@18440 | 917 END_METHOD |
pascal@18440 | 918 |
pascal@18440 | 919 BEGIN_PROPERTY (PDFPAGE_property_picture) |
pascal@18440 | 920 |
pascal@18440 | 921 int32_t w=-1; |
pascal@18440 | 922 int32_t h=-1; |
pascal@18440 | 923 GB_IMAGE img = NULL; |
pascal@18440 | 924 uint32_t *data; |
pascal@18440 | 925 |
pascal@18440 | 926 data = get_page_data(THIS, 0, 0, &w, &h, THIS->scale, THIS->rotation); |
pascal@18440 | 927 if (!data) { GB.ReturnNull(); return; } |
pascal@18440 | 928 GB.Picture.Create(&img, data, w, h, GB_IMAGE_RGB); |
pascal@18440 | 929 GB.ReturnObject(img); |
pascal@18440 | 930 |
pascal@18440 | 931 END_PROPERTY |
pascal@18440 | 932 |
pascal@18440 | 933 BEGIN_METHOD(PDFPAGE_select, GB_INTEGER X; GB_INTEGER Y; GB_INTEGER W; GB_INTEGER H) |
pascal@18440 | 934 |
pascal@18440 | 935 TextOutputDev *dev; |
pascal@18440 | 936 GooString *str; |
pascal@18440 | 937 Gfx *gfx; |
pascal@18440 | 938 int32_t x,y,w,h; |
pascal@18440 | 939 |
pascal@18440 | 940 x = VARGOPT(X, 0); |
pascal@18440 | 941 y = VARGOPT(Y, 0); |
pascal@18440 | 942 w = VARGOPT(W, (int32_t)THIS->page->getMediaWidth()); |
pascal@18440 | 943 h = VARGOPT(H, (int32_t)THIS->page->getMediaHeight()); |
pascal@18440 | 944 |
pascal@18440 | 945 #if POPPLER_VERSION_0_20 |
pascal@18440 | 946 dev = new TextOutputDev (NULL, gTrue, 0, gFalse, gFalse); |
pascal@18440 | 947 gfx = THIS->page->createGfx(dev,72.0,72.0,0,gFalse,gTrue,-1, -1, -1, -1, gFalse, NULL, NULL); |
pascal@18440 | 948 #else |
pascal@18440 | 949 dev = new TextOutputDev (NULL, gTrue, gFalse, gFalse); |
pascal@18440 | 950 gfx = THIS->page->createGfx(dev,72.0,72.0,0,gFalse,gTrue,-1, -1, -1, -1, \ |
pascal@18440 | 951 gFalse,THIS->doc->getCatalog (),NULL, NULL, NULL, NULL); |
pascal@18440 | 952 #endif |
pascal@18440 | 953 |
pascal@18440 | 954 THIS->page->display(gfx); |
pascal@18440 | 955 dev->endPage(); |
pascal@18440 | 956 |
pascal@18440 | 957 str=dev->getText((double)x,(double)y,(double)(w+x),(double)(h+y)); |
pascal@18440 | 958 |
pascal@18440 | 959 delete gfx; |
pascal@18440 | 960 delete dev; |
pascal@18440 | 961 |
pascal@18440 | 962 if (!str) |
pascal@18440 | 963 { |
pascal@18440 | 964 GB.ReturnNewZeroString(""); |
pascal@18440 | 965 return; |
pascal@18440 | 966 } |
pascal@18440 | 967 |
pascal@18440 | 968 GB.ReturnNewString(str->getCString(),str->getLength()); |
pascal@18440 | 969 delete str; |
pascal@18440 | 970 |
pascal@18440 | 971 END_METHOD |
pascal@18440 | 972 |
pascal@18440 | 973 /***************************************************************************** |
pascal@18440 | 974 |
pascal@18440 | 975 Bookmarks of a PDF page |
pascal@18440 | 976 |
pascal@18440 | 977 ******************************************************************************/ |
pascal@18440 | 978 |
pascal@18440 | 979 void aux_fill_links(void *_object) |
pascal@18440 | 980 { |
pascal@18440 | 981 #if POPPLER_VERSION_0_20 |
pascal@18440 | 982 THIS->links = new Links (THIS->page->getAnnots ()); |
pascal@18440 | 983 #elif POPPLER_VERSION_0_17 |
pascal@18440 | 984 THIS->links = new Links (THIS->page->getAnnots (THIS->doc->getCatalog())); |
pascal@18440 | 985 #else |
pascal@18440 | 986 Object obj; |
pascal@18440 | 987 |
pascal@18440 | 988 THIS->links = new Links (THIS->page->getAnnots (&obj),THIS->doc->getCatalog()->getBaseURI ()); |
pascal@18440 | 989 obj.free(); |
pascal@18440 | 990 #endif |
pascal@18440 | 991 } |
pascal@18440 | 992 |
pascal@18440 | 993 BEGIN_PROPERTY (PDFPAGELINKS_count) |
pascal@18440 | 994 |
pascal@18440 | 995 if (!THIS->links) aux_fill_links(_object); |
pascal@18440 | 996 if (!THIS->links) { GB.ReturnInteger(0); return; } |
pascal@18440 | 997 GB.ReturnInteger(THIS->links->getNumLinks()); |
pascal@18440 | 998 |
pascal@18440 | 999 |
pascal@18440 | 1000 END_PROPERTY |
pascal@18440 | 1001 |
pascal@18440 | 1002 BEGIN_METHOD (PDFPAGELINKS_get,GB_INTEGER ind;) |
pascal@18440 | 1003 |
pascal@18440 | 1004 bool pok=true; |
pascal@18440 | 1005 |
pascal@18440 | 1006 if (!THIS->links) aux_fill_links(_object); |
pascal@18440 | 1007 if (!THIS->links) pok=false; |
pascal@18440 | 1008 else |
pascal@18440 | 1009 { |
pascal@18440 | 1010 if (VARG(ind)<0) pok=false; |
pascal@18440 | 1011 else |
pascal@18440 | 1012 { |
pascal@18440 | 1013 if (VARG(ind)>=THIS->links->getNumLinks()) pok=false; |
pascal@18440 | 1014 } |
pascal@18440 | 1015 } |
pascal@18440 | 1016 |
pascal@18440 | 1017 if (!pok) { GB.Error("Out of bounds"); GB.ReturnNull(); return; } |
pascal@18440 | 1018 |
pascal@18440 | 1019 THIS->lcurrent=VARG(ind); |
pascal@18440 | 1020 THIS->action=THIS->links->getLink(THIS->lcurrent)->getAction(); |
pascal@18440 | 1021 |
pascal@18440 | 1022 RETURN_SELF(); |
pascal@18440 | 1023 |
pascal@18440 | 1024 END_METHOD |
pascal@18440 | 1025 |
pascal@18440 | 1026 BEGIN_PROPERTY (PDFPAGELINKDATA_parameters) |
pascal@18440 | 1027 |
pascal@18440 | 1028 if (THIS->action->getKind() != actionLaunch ) |
pascal@18440 | 1029 { |
pascal@18440 | 1030 GB.ReturnNewZeroString(""); |
pascal@18440 | 1031 return; |
pascal@18440 | 1032 } |
pascal@18440 | 1033 |
pascal@18440 | 1034 GB.ReturnNewZeroString(((LinkLaunch*)THIS->action)->getParams()->getCString()); |
pascal@18440 | 1035 |
pascal@18440 | 1036 END_PROPERTY |
pascal@18440 | 1037 |
pascal@18440 | 1038 BEGIN_PROPERTY (PDFPAGELINKDATA_uri) |
pascal@18440 | 1039 |
pascal@18440 | 1040 char *uri; |
pascal@18440 | 1041 |
pascal@18440 | 1042 uri=aux_get_target_from_action(THIS->action); |
pascal@18440 | 1043 |
pascal@18440 | 1044 GB.ReturnNewZeroString(uri); |
pascal@18440 | 1045 if (uri) GB.FreeString(&uri); |
pascal@18440 | 1046 |
pascal@18440 | 1047 END_PROPERTY |
pascal@18440 | 1048 |
pascal@18440 | 1049 BEGIN_PROPERTY(PDFPAGELINKDATA_left) |
pascal@18440 | 1050 |
pascal@18440 | 1051 int32_t vl; |
pascal@18440 | 1052 |
pascal@18440 | 1053 aux_get_dimensions_from_action(THIS->action,&vl, NULL, NULL, NULL); |
pascal@18440 | 1054 GB.ReturnInteger(vl); |
pascal@18440 | 1055 |
pascal@18440 | 1056 END_PROPERTY |
pascal@18440 | 1057 |
pascal@18440 | 1058 BEGIN_PROPERTY(PDFPAGELINKDATA_right) |
pascal@18440 | 1059 |
pascal@18440 | 1060 int32_t vl; |
pascal@18440 | 1061 |
pascal@18440 | 1062 aux_get_dimensions_from_action(THIS->action,NULL,&vl, NULL, NULL); |
pascal@18440 | 1063 GB.ReturnInteger(vl); |
pascal@18440 | 1064 |
pascal@18440 | 1065 END_PROPERTY |
pascal@18440 | 1066 |
pascal@18440 | 1067 BEGIN_PROPERTY(PDFPAGELINKDATA_top) |
pascal@18440 | 1068 |
pascal@18440 | 1069 int32_t vl; |
pascal@18440 | 1070 |
pascal@18440 | 1071 aux_get_dimensions_from_action(THIS->action,NULL,NULL,&vl, NULL); |
pascal@18440 | 1072 GB.ReturnInteger(vl); |
pascal@18440 | 1073 |
pascal@18440 | 1074 END_PROPERTY |
pascal@18440 | 1075 |
pascal@18440 | 1076 BEGIN_PROPERTY(PDFPAGELINKDATA_bottom) |
pascal@18440 | 1077 |
pascal@18440 | 1078 int32_t vl; |
pascal@18440 | 1079 |
pascal@18440 | 1080 aux_get_dimensions_from_action(THIS->action,NULL, NULL, NULL,&vl); |
pascal@18440 | 1081 |
pascal@18440 | 1082 GB.ReturnInteger(vl); |
pascal@18440 | 1083 |
pascal@18440 | 1084 END_PROPERTY |
pascal@18440 | 1085 |
pascal@18440 | 1086 BEGIN_PROPERTY(PDFPAGELINKDATA_zoom) |
pascal@18440 | 1087 |
pascal@18440 | 1088 GB.ReturnFloat(aux_get_zoom_from_action(THIS->action)); |
pascal@18440 | 1089 |
pascal@18440 | 1090 END_PROPERTY |
pascal@18440 | 1091 |
pascal@18440 | 1092 BEGIN_PROPERTY(PDFPAGELINKDATA_page) |
pascal@18440 | 1093 |
pascal@18440 | 1094 GB.ReturnInteger(aux_get_page_from_action(_object,THIS->action)); |
pascal@18440 | 1095 |
pascal@18440 | 1096 END_PROPERTY |
pascal@18440 | 1097 |
pascal@18440 | 1098 BEGIN_PROPERTY (PDFPAGELINKDATA_type) |
pascal@18440 | 1099 |
pascal@18440 | 1100 GB.ReturnInteger ( (int32_t)THIS->action->getKind() ); |
pascal@18440 | 1101 |
pascal@18440 | 1102 END_PROPERTY |
pascal@18440 | 1103 |
pascal@18440 | 1104 BEGIN_PROPERTY(PDFPAGELINKDATA_check) |
pascal@18440 | 1105 |
pascal@18440 | 1106 if (THIS->action) |
pascal@18440 | 1107 RETURN_SELF(); |
pascal@18440 | 1108 else |
pascal@18440 | 1109 GB.ReturnNull(); |
pascal@18440 | 1110 |
pascal@18440 | 1111 END_PROPERTY |
pascal@18440 | 1112 |
pascal@18440 | 1113 void aux_get_link_dimensions(void *_object,int32_t *left, int32_t *top, int32_t *width, int32_t *height) |
pascal@18440 | 1114 { |
pascal@18440 | 1115 double l,t,w,h; |
pascal@18440 | 1116 double pw,ph; |
pascal@18440 | 1117 |
pascal@18440 | 1118 pw=THIS->page->getMediaWidth(); |
pascal@18440 | 1119 ph=THIS->page->getMediaHeight(); |
pascal@18440 | 1120 |
pascal@18440 | 1121 THIS->links->getLink(THIS->lcurrent)->getRect(&l, &t, &w, &h); |
pascal@18440 | 1122 w=w-l; |
pascal@18440 | 1123 h=h-t; |
pascal@18440 | 1124 |
pascal@18440 | 1125 switch (THIS->rotation) |
pascal@18440 | 1126 { |
pascal@18440 | 1127 case 0: |
pascal@18440 | 1128 if (left) *left=(int32_t)(l*THIS->scale); |
pascal@18440 | 1129 if (top) *top=(int32_t)((ph-t-h)*THIS->scale); |
pascal@18440 | 1130 if (width) *width=(int32_t)(w*THIS->scale); |
pascal@18440 | 1131 if (height) *height=(int32_t)(h*THIS->scale); |
pascal@18440 | 1132 break; |
pascal@18440 | 1133 |
pascal@18440 | 1134 case 90: |
pascal@18440 | 1135 if (top) *top=(int32_t)(l*THIS->scale); |
pascal@18440 | 1136 if (left) *left=(int32_t)(t*THIS->scale); |
pascal@18440 | 1137 if (height) *height=(int32_t)(w*THIS->scale); |
pascal@18440 | 1138 if (width) *width=(int32_t)(h*THIS->scale); |
pascal@18440 | 1139 break; |
pascal@18440 | 1140 |
pascal@18440 | 1141 case 180: |
pascal@18440 | 1142 if (left) *left=(int32_t)((l-w)*THIS->scale); |
pascal@18440 | 1143 if (top) *top=(int32_t)(t*THIS->scale); |
pascal@18440 | 1144 if (width) *width=(int32_t)(w*THIS->scale); |
pascal@18440 | 1145 if (height) *height=(int32_t)(h*THIS->scale); |
pascal@18440 | 1146 break; |
pascal@18440 | 1147 |
pascal@18440 | 1148 case 270: |
pascal@18440 | 1149 if (top) *top=(int32_t)((pw-l-w)*THIS->scale); |
pascal@18440 | 1150 if (left) *left=(int32_t)((ph-t-h)*THIS->scale); |
pascal@18440 | 1151 if (height) *height=(int32_t)(w*THIS->scale); |
pascal@18440 | 1152 if (width) *width=(int32_t)(h*THIS->scale); |
pascal@18440 | 1153 break; |
pascal@18440 | 1154 } |
pascal@18440 | 1155 |
pascal@18440 | 1156 } |
pascal@18440 | 1157 |
pascal@18440 | 1158 BEGIN_PROPERTY (PDFPAGELINK_width) |
pascal@18440 | 1159 |
pascal@18440 | 1160 int32_t vl; |
pascal@18440 | 1161 |
pascal@18440 | 1162 aux_get_link_dimensions(_object,NULL,NULL,&vl,NULL); |
pascal@18440 | 1163 GB.ReturnInteger(vl); |
pascal@18440 | 1164 |
pascal@18440 | 1165 END_PROPERTY |
pascal@18440 | 1166 |
pascal@18440 | 1167 BEGIN_PROPERTY (PDFPAGELINK_height) |
pascal@18440 | 1168 |
pascal@18440 | 1169 int32_t vl; |
pascal@18440 | 1170 |
pascal@18440 | 1171 aux_get_link_dimensions(_object,NULL,NULL,NULL,&vl); |
pascal@18440 | 1172 GB.ReturnInteger(vl); |
pascal@18440 | 1173 |
pascal@18440 | 1174 |
pascal@18440 | 1175 END_PROPERTY |
pascal@18440 | 1176 |
pascal@18440 | 1177 BEGIN_PROPERTY (PDFPAGELINK_left) |
pascal@18440 | 1178 |
pascal@18440 | 1179 int32_t vl; |
pascal@18440 | 1180 |
pascal@18440 | 1181 aux_get_link_dimensions(_object,&vl,NULL,NULL,NULL); |
pascal@18440 | 1182 GB.ReturnInteger(vl); |
pascal@18440 | 1183 |
pascal@18440 | 1184 |
pascal@18440 | 1185 END_PROPERTY |
pascal@18440 | 1186 |
pascal@18440 | 1187 BEGIN_PROPERTY (PDFPAGELINK_top) |
pascal@18440 | 1188 |
pascal@18440 | 1189 int32_t vl; |
pascal@18440 | 1190 |
pascal@18440 | 1191 aux_get_link_dimensions(_object,NULL,&vl,NULL,NULL); |
pascal@18440 | 1192 GB.ReturnInteger(vl); |
pascal@18440 | 1193 |
pascal@18440 | 1194 END_PROPERTY |
pascal@18440 | 1195 |
pascal@18440 | 1196 /***************************************************************************** |
pascal@18440 | 1197 |
pascal@18440 | 1198 Finding a text in a PDF page |
pascal@18440 | 1199 |
pascal@18440 | 1200 ******************************************************************************/ |
pascal@18440 | 1201 |
pascal@18440 | 1202 BEGIN_METHOD (PDFPAGE_find,GB_STRING Text; GB_BOOLEAN Sensitive;) |
pascal@18440 | 1203 |
pascal@18440 | 1204 TextOutputDev *textdev; |
pascal@18440 | 1205 double x0=0, y0=0; |
pascal@18440 | 1206 double x1, y1; |
pascal@18440 | 1207 FoundRect *el; |
pascal@18440 | 1208 Unicode *block=NULL; |
pascal@18440 | 1209 int32_t nlen=0; |
pascal@18440 | 1210 bool sensitive=false; |
pascal@18440 | 1211 |
pascal@18440 | 1212 // TODO: Use UCS-4BE on big endian systems? |
pascal@18440 | 1213 if (GB.ConvString ((char **)(void *)&block,STRING(Text),LENGTH(Text),"UTF-8","UCS-4LE")) |
pascal@18440 | 1214 { |
pascal@18440 | 1215 GB.Error("Invalid UTF-8 string"); |
pascal@18440 | 1216 return; |
pascal@18440 | 1217 } |
pascal@18440 | 1218 |
pascal@18440 | 1219 nlen=GB.StringLength((char*)block)/sizeof(Unicode); |
pascal@18440 | 1220 |
pascal@18440 | 1221 if (!MISSING(Sensitive)) sensitive=VARG(Sensitive); |
pascal@18440 | 1222 |
pascal@18440 | 1223 #if POPPLER_VERSION_0_20 |
pascal@18440 | 1224 textdev = new TextOutputDev (NULL, true, 0, false, false); |
pascal@18440 | 1225 THIS->page->display (textdev, 72, 72, 0, false, false, false); |
pascal@18440 | 1226 #else |
pascal@18440 | 1227 textdev = new TextOutputDev (NULL, true, false, false); |
pascal@18440 | 1228 THIS->page->display (textdev, 72, 72, 0, false, false, false, THIS->doc->getCatalog()); |
pascal@18440 | 1229 #endif |
pascal@18440 | 1230 |
pascal@18440 | 1231 if (THIS->Found) { GB.FreeArray(POINTER(&THIS->Found)); THIS->Found=NULL; } |
pascal@18440 | 1232 |
pascal@18440 | 1233 #if POPPLER_VERSION_0_20 |
pascal@18440 | 1234 while (textdev->findText (block,nlen,gFalse,gTrue,gTrue,gFalse,sensitive,gFalse,gFalse,&x0,&y0,&x1,&y1)) |
pascal@18440 | 1235 #else |
pascal@18440 | 1236 while (textdev->findText (block,nlen,gFalse,gTrue,gTrue,gFalse,sensitive,gFalse,&x0,&y0,&x1,&y1)) |
pascal@18440 | 1237 #endif |
pascal@18440 | 1238 { |
pascal@18440 | 1239 if (!THIS->Found) { |
pascal@18440 | 1240 GB.NewArray(POINTER(&THIS->Found),sizeof(FoundRect),1); |
pascal@18440 | 1241 } |
pascal@18440 | 1242 else { |
pascal@18440 | 1243 GB.Add(POINTER(&THIS->Found)); |
pascal@18440 | 1244 } |
pascal@18440 | 1245 |
pascal@18440 | 1246 el=(FoundRect*)&((FoundRect*)THIS->Found)[GB.Count(POINTER(THIS->Found))-1]; |
pascal@18440 | 1247 |
pascal@18440 | 1248 switch (THIS->rotation) |
pascal@18440 | 1249 { |
pascal@18440 | 1250 case 0: |
pascal@18440 | 1251 el->x0=(int32_t)(x0*THIS->scale); |
pascal@18440 | 1252 el->y0=(int32_t)(y0*THIS->scale); |
pascal@18440 | 1253 el->x1=(int32_t)((x1-x0)*THIS->scale); |
pascal@18440 | 1254 el->y1=(int32_t)((y1-y0)*THIS->scale); |
pascal@18440 | 1255 break; |
pascal@18440 | 1256 |
pascal@18440 | 1257 case 90: |
pascal@18440 | 1258 el->y1=(int32_t)((x1-x0)*THIS->scale); |
pascal@18440 | 1259 el->x1=(int32_t)(y1-y0); |
pascal@18440 | 1260 el->y0=(int32_t)(x0*THIS->scale); |
pascal@18440 | 1261 el->x0=(int32_t)((THIS->page->getMediaHeight()-y0-el->x1)*THIS->scale); |
pascal@18440 | 1262 el->x1=(int32_t)(el->x1*THIS->scale); |
pascal@18440 | 1263 break; |
pascal@18440 | 1264 |
pascal@18440 | 1265 case 180: |
pascal@18440 | 1266 el->x1=(int32_t)(x1-x0); |
pascal@18440 | 1267 el->y1=(int32_t)(y1-y0); |
pascal@18440 | 1268 el->x0=(int32_t)((THIS->page->getMediaWidth()-x0-el->x1)*THIS->scale); |
pascal@18440 | 1269 el->y0=(int32_t)((THIS->page->getMediaHeight()-y0-el->y1)*THIS->scale); |
pascal@18440 | 1270 el->x1=(int32_t)(el->x1*THIS->scale); |
pascal@18440 | 1271 el->y1=(int32_t)(el->y1*THIS->scale); |
pascal@18440 | 1272 break; |
pascal@18440 | 1273 |
pascal@18440 | 1274 case 270: |
pascal@18440 | 1275 el->x1=(int32_t)((y1-y0)*THIS->scale); |
pascal@18440 | 1276 el->y1=(int32_t)(x1-x0); |
pascal@18440 | 1277 el->x0=(int32_t)(y0*THIS->scale); |
pascal@18440 | 1278 el->y0=(int32_t)((THIS->page->getMediaWidth()-x0-el->y1)*THIS->scale); |
pascal@18440 | 1279 el->y1=(int32_t)(el->y1*THIS->scale); |
pascal@18440 | 1280 break; |
pascal@18440 | 1281 |
pascal@18440 | 1282 } |
pascal@18440 | 1283 } |
pascal@18440 | 1284 |
pascal@18440 | 1285 delete textdev; |
pascal@18440 | 1286 |
pascal@18440 | 1287 |
pascal@18440 | 1288 END_METHOD |
pascal@18440 | 1289 |
pascal@18440 | 1290 |
pascal@18440 | 1291 BEGIN_METHOD (PDFPAGERESULT_get,GB_INTEGER Index;) |
pascal@18440 | 1292 |
pascal@18440 | 1293 bool bok=true; |
pascal@18440 | 1294 |
pascal@18440 | 1295 if (!THIS->Found) bok=false; |
pascal@18440 | 1296 else |
pascal@18440 | 1297 { |
pascal@18440 | 1298 if (VARG(Index)<0) bok=false; |
pascal@18440 | 1299 if (VARG(Index)>= GB.Count(POINTER(THIS->Found)) ) bok=false; |
pascal@18440 | 1300 } |
pascal@18440 | 1301 if (!bok) { GB.Error("Out of bounds"); GB.ReturnNull(); return; } |
pascal@18440 | 1302 |
pascal@18440 | 1303 THIS->fcurrent=VARG(Index); |
pascal@18440 | 1304 RETURN_SELF(); |
pascal@18440 | 1305 |
pascal@18440 | 1306 END_METHOD |
pascal@18440 | 1307 |
pascal@18440 | 1308 BEGIN_PROPERTY (PDFPAGERESULT_count) |
pascal@18440 | 1309 |
pascal@18440 | 1310 if (!THIS->Found) { GB.ReturnInteger(0); return; } |
pascal@18440 | 1311 GB.ReturnInteger( GB.Count(POINTER(THIS->Found)) ); |
pascal@18440 | 1312 |
pascal@18440 | 1313 END_PROPERTY |
pascal@18440 | 1314 |
pascal@18440 | 1315 BEGIN_PROPERTY (PDFPAGERESULT_width) |
pascal@18440 | 1316 |
pascal@18440 | 1317 FoundRect *el=(FoundRect*)&((FoundRect*)THIS->Found)[THIS->fcurrent]; |
pascal@18440 | 1318 GB.ReturnInteger((int32_t)el->x1); |
pascal@18440 | 1319 |
pascal@18440 | 1320 END_PROPERTY |
pascal@18440 | 1321 |
pascal@18440 | 1322 BEGIN_PROPERTY (PDFPAGERESULT_height) |
pascal@18440 | 1323 |
pascal@18440 | 1324 FoundRect *el=(FoundRect*)&((FoundRect*)THIS->Found)[THIS->fcurrent]; |
pascal@18440 | 1325 GB.ReturnInteger((int32_t)el->y1); |
pascal@18440 | 1326 |
pascal@18440 | 1327 END_PROPERTY |
pascal@18440 | 1328 |
pascal@18440 | 1329 BEGIN_PROPERTY (PDFPAGERESULT_left) |
pascal@18440 | 1330 |
pascal@18440 | 1331 FoundRect *el=(FoundRect*)&((FoundRect*)THIS->Found)[THIS->fcurrent]; |
pascal@18440 | 1332 GB.ReturnInteger((int32_t)el->x0); |
pascal@18440 | 1333 |
pascal@18440 | 1334 END_PROPERTY |
pascal@18440 | 1335 |
pascal@18440 | 1336 BEGIN_PROPERTY (PDFPAGERESULT_top) |
pascal@18440 | 1337 |
pascal@18440 | 1338 FoundRect *el=(FoundRect*)&((FoundRect*)THIS->Found)[THIS->fcurrent]; |
pascal@18440 | 1339 GB.ReturnInteger((int32_t)el->y0); |
pascal@18440 | 1340 |
pascal@18440 | 1341 END_PROPERTY |
pascal@18440 | 1342 |
pascal@18440 | 1343 /********************************************************************** |
pascal@18440 | 1344 |
pascal@18440 | 1345 Gambas Interface |
pascal@18440 | 1346 |
pascal@18440 | 1347 ***********************************************************************/ |
pascal@18440 | 1348 |
pascal@18440 | 1349 |
pascal@18440 | 1350 GB_DESC PdfResultItemDesc[]= |
pascal@18440 | 1351 { |
pascal@18440 | 1352 GB_DECLARE(".PdfResultItem",0), GB_VIRTUAL_CLASS(), |
pascal@18440 | 1353 |
pascal@18440 | 1354 GB_PROPERTY_READ("Left","i",PDFPAGERESULT_left), |
pascal@18440 | 1355 GB_PROPERTY_READ("Top","i",PDFPAGERESULT_top), |
pascal@18440 | 1356 GB_PROPERTY_READ("Width","i",PDFPAGERESULT_width), |
pascal@18440 | 1357 GB_PROPERTY_READ("Height","i",PDFPAGERESULT_height), |
pascal@18440 | 1358 |
pascal@18440 | 1359 GB_END_DECLARE |
pascal@18440 | 1360 }; |
pascal@18440 | 1361 |
pascal@18440 | 1362 GB_DESC PdfResultDesc[]= |
pascal@18440 | 1363 { |
pascal@18440 | 1364 GB_DECLARE(".PdfResult",0), GB_VIRTUAL_CLASS(), |
pascal@18440 | 1365 |
pascal@18440 | 1366 GB_METHOD("_get",".PdfResultItem",PDFPAGERESULT_get,"(Index)i"), |
pascal@18440 | 1367 GB_PROPERTY_READ("Count","i",PDFPAGERESULT_count), |
pascal@18440 | 1368 |
pascal@18440 | 1369 GB_END_DECLARE |
pascal@18440 | 1370 }; |
pascal@18440 | 1371 |
pascal@18440 | 1372 |
pascal@18440 | 1373 GB_DESC PdfLinkDataDesc[]= |
pascal@18440 | 1374 { |
pascal@18440 | 1375 GB_DECLARE(".PdfLinkData",0), GB_VIRTUAL_CLASS(), |
pascal@18440 | 1376 |
pascal@18440 | 1377 GB_PROPERTY_READ("Type","i",PDFPAGELINKDATA_type), |
pascal@18440 | 1378 GB_PROPERTY_READ("Target","s",PDFPAGELINKDATA_uri), |
pascal@18440 | 1379 GB_PROPERTY_READ("Parameters","s",PDFPAGELINKDATA_parameters), |
pascal@18440 | 1380 GB_PROPERTY_READ("Page","i",PDFPAGELINKDATA_page), |
pascal@18440 | 1381 GB_PROPERTY_READ("Left","i",PDFPAGELINKDATA_left), |
pascal@18440 | 1382 GB_PROPERTY_READ("Top","i",PDFPAGELINKDATA_top), |
pascal@18440 | 1383 GB_PROPERTY_READ("Right","i",PDFPAGELINKDATA_right), |
pascal@18440 | 1384 GB_PROPERTY_READ("Bottom","i",PDFPAGELINKDATA_bottom), |
pascal@18440 | 1385 GB_PROPERTY_READ("Zoom","f",PDFPAGELINKDATA_zoom), |
pascal@18440 | 1386 |
pascal@18440 | 1387 GB_END_DECLARE |
pascal@18440 | 1388 }; |
pascal@18440 | 1389 |
pascal@18440 | 1390 GB_DESC PdfLinkDesc[]= |
pascal@18440 | 1391 { |
pascal@18440 | 1392 GB_DECLARE(".PdfLink",0), GB_VIRTUAL_CLASS(), |
pascal@18440 | 1393 |
pascal@18440 | 1394 GB_PROPERTY_READ("Left","i",PDFPAGELINK_left), |
pascal@18440 | 1395 GB_PROPERTY_READ("Top","i",PDFPAGELINK_top), |
pascal@18440 | 1396 GB_PROPERTY_READ("Width","i",PDFPAGELINK_width), |
pascal@18440 | 1397 GB_PROPERTY_READ("Height","i",PDFPAGELINK_height), |
pascal@18440 | 1398 GB_PROPERTY_READ("Data", ".PdfLinkData", PDFPAGELINKDATA_check), |
pascal@18440 | 1399 |
pascal@18440 | 1400 GB_END_DECLARE |
pascal@18440 | 1401 }; |
pascal@18440 | 1402 |
pascal@18440 | 1403 GB_DESC PdfIndexDesc[]= |
pascal@18440 | 1404 { |
pascal@18440 | 1405 GB_DECLARE(".PdfIndex",0), GB_VIRTUAL_CLASS(), |
pascal@18440 | 1406 |
pascal@18440 | 1407 GB_PROPERTY("Expanded","b",PDFINDEX_is_open), |
pascal@18440 | 1408 GB_PROPERTY_READ("Count","i",PDFINDEX_count), |
pascal@18440 | 1409 GB_PROPERTY_READ("HasChildren","b",PDFINDEX_has_children), |
pascal@18440 | 1410 GB_PROPERTY_READ("Title","s",PDFINDEX_title), |
pascal@18440 | 1411 |
pascal@18440 | 1412 GB_PROPERTY_READ("Data", ".PdfLinkData", PDFPAGELINKDATA_check), |
pascal@18440 | 1413 GB_METHOD("MovePrevious","b",PDFINDEX_prev,0), |
pascal@18440 | 1414 GB_METHOD("MoveNext","b",PDFINDEX_next,0), |
pascal@18440 | 1415 GB_METHOD("MoveChild","b",PDFINDEX_child,0), |
pascal@18440 | 1416 GB_METHOD("MoveParent","b",PDFINDEX_parent,0), |
pascal@18440 | 1417 GB_METHOD("MoveRoot",0,PDFINDEX_root,0), |
pascal@18440 | 1418 |
pascal@18440 | 1419 GB_END_DECLARE |
pascal@18440 | 1420 }; |
pascal@18440 | 1421 |
pascal@18440 | 1422 |
pascal@18440 | 1423 GB_DESC PdfPageDesc[]= |
pascal@18440 | 1424 { |
pascal@18440 | 1425 GB_DECLARE(".PdfPage",0), GB_VIRTUAL_CLASS(), |
pascal@18440 | 1426 |
pascal@18440 | 1427 GB_PROPERTY_READ("W","f",PDFPAGE_width), |
pascal@18440 | 1428 GB_PROPERTY_READ("H","f",PDFPAGE_height), |
pascal@18440 | 1429 GB_PROPERTY_READ("Width","f",PDFPAGE_width), |
pascal@18440 | 1430 GB_PROPERTY_READ("Height","f",PDFPAGE_height), |
pascal@18440 | 1431 GB_PROPERTY_READ("Picture","Picture",PDFPAGE_property_picture), |
pascal@18440 | 1432 GB_PROPERTY_READ("Image","Image",PDFPAGE_property_image), |
pascal@18440 | 1433 GB_PROPERTY_SELF("Result",".PdfResult"), |
pascal@18440 | 1434 |
pascal@18440 | 1435 GB_METHOD("GetImage","Image",PDFPAGE_image,"[(X)i(Y)i(Width)i(Height)i]"), |
pascal@18440 | 1436 GB_METHOD("GetPicture","Picture",PDFPAGE_picture,"[(X)i(Y)i(Width)i(Height)i]"), |
pascal@18440 | 1437 GB_METHOD("Find","b",PDFPAGE_find,"(Text)s[(CaseSensitive)b]"), |
pascal@18440 | 1438 GB_METHOD("Select","s",PDFPAGE_select,"[(X)i(Y)i(W)i(H)i]"), |
pascal@18440 | 1439 |
pascal@18440 | 1440 GB_METHOD("_get",".PdfLink",PDFPAGELINKS_get,"(Index)i"), |
pascal@18440 | 1441 GB_PROPERTY_READ("Count","i",PDFPAGELINKS_count), |
pascal@18440 | 1442 |
pascal@18440 | 1443 GB_END_DECLARE |
pascal@18440 | 1444 }; |
pascal@18440 | 1445 |
pascal@18440 | 1446 GB_DESC PdfDocumentInfo[] = |
pascal@18440 | 1447 { |
pascal@18440 | 1448 GB_DECLARE(".PdfInfo",0), GB_VIRTUAL_CLASS(), |
pascal@18440 | 1449 |
pascal@18440 | 1450 GB_PROPERTY_READ("Title","s",PDFINFO_title), |
pascal@18440 | 1451 GB_PROPERTY_READ("Format","s",PDFINFO_format), |
pascal@18440 | 1452 GB_PROPERTY_READ("Author","s",PDFINFO_author), |
pascal@18440 | 1453 GB_PROPERTY_READ("Subject","s",PDFINFO_subject), |
pascal@18440 | 1454 GB_PROPERTY_READ("Keywords","s",PDFINFO_keywords), |
pascal@18440 | 1455 GB_PROPERTY_READ("Creator","s",PDFINFO_creator), |
pascal@18440 | 1456 GB_PROPERTY_READ("Producer","s",PDFINFO_producer), |
pascal@18440 | 1457 GB_PROPERTY_READ("CreationDate","d",PDFINFO_creation), |
pascal@18440 | 1458 GB_PROPERTY_READ("ModificationDate","d",PDFINFO_modification), |
pascal@18440 | 1459 GB_PROPERTY_READ("Linearized","b",PDFINFO_linearized), |
pascal@18440 | 1460 GB_PROPERTY_READ("Layout","i",PDFINFO_layout), |
pascal@18440 | 1461 GB_PROPERTY_READ("Mode","i",PDFINFO_mode), |
pascal@18440 | 1462 GB_PROPERTY_READ("CanCopy","b",PDFINFO_cancopy), |
pascal@18440 | 1463 GB_PROPERTY_READ("CanModify","b",PDFINFO_canmodify), |
pascal@18440 | 1464 GB_PROPERTY_READ("CanPrint","b",PDFINFO_canprint), |
pascal@18440 | 1465 GB_PROPERTY_READ("CanAddNotes","b",PDFINFO_canaddnotes), |
pascal@18440 | 1466 |
pascal@18440 | 1467 GB_END_DECLARE |
pascal@18440 | 1468 }; |
pascal@18440 | 1469 |
pascal@18440 | 1470 GB_DESC PdfLayoutDesc[] = |
pascal@18440 | 1471 { |
pascal@18440 | 1472 |
pascal@18440 | 1473 GB_DECLARE("PdfLayout", 0), GB_NOT_CREATABLE(), |
pascal@18440 | 1474 |
pascal@18440 | 1475 GB_CONSTANT("Unset","i",Catalog::pageLayoutNone), |
pascal@18440 | 1476 GB_CONSTANT("SinglePage","i",Catalog::pageLayoutSinglePage), |
pascal@18440 | 1477 GB_CONSTANT("OneColumn","i",Catalog::pageLayoutOneColumn), |
pascal@18440 | 1478 GB_CONSTANT("TwoColumnLeft","i",Catalog::pageLayoutTwoColumnLeft), |
pascal@18440 | 1479 GB_CONSTANT("TwoColumnRight","i",Catalog::pageLayoutTwoColumnRight), |
pascal@18440 | 1480 GB_CONSTANT("TwoPageLeft","i",Catalog::pageLayoutTwoPageLeft), |
pascal@18440 | 1481 GB_CONSTANT("TwoPageRight","i",Catalog::pageLayoutTwoPageRight), |
pascal@18440 | 1482 |
pascal@18440 | 1483 GB_END_DECLARE |
pascal@18440 | 1484 }; |
pascal@18440 | 1485 |
pascal@18440 | 1486 |
pascal@18440 | 1487 GB_DESC PdfModeDesc[] = |
pascal@18440 | 1488 { |
pascal@18440 | 1489 GB_DECLARE("PdfPageMode",0), GB_NOT_CREATABLE(), |
pascal@18440 | 1490 |
pascal@18440 | 1491 GB_CONSTANT("Unset","i",Catalog::pageModeNone), |
pascal@18440 | 1492 GB_CONSTANT("UseOutlines","i",Catalog::pageModeOutlines), |
pascal@18440 | 1493 GB_CONSTANT("UseThumbs","i",Catalog::pageModeThumbs), |
pascal@18440 | 1494 GB_CONSTANT("FullScreen","i",Catalog::pageModeFullScreen), |
pascal@18440 | 1495 GB_CONSTANT("UseOC","i",Catalog::pageModeOC), |
pascal@18440 | 1496 GB_CONSTANT("UseAttachments","i",Catalog::pageModeAttach), |
pascal@18440 | 1497 |
pascal@18440 | 1498 GB_END_DECLARE |
pascal@18440 | 1499 }; |
pascal@18440 | 1500 |
pascal@18440 | 1501 GB_DESC PdfDocumentDesc[] = |
pascal@18440 | 1502 { |
pascal@18440 | 1503 |
pascal@18440 | 1504 GB_DECLARE("PdfDocument", sizeof(CPDFDOCUMENT)), |
pascal@18440 | 1505 |
pascal@18440 | 1506 GB_CONSTANT("Unknown","i",actionUnknown), /* unknown action */ |
pascal@18440 | 1507 GB_CONSTANT("Goto","i",actionGoTo), /* go to destination */ |
pascal@18440 | 1508 GB_CONSTANT("GotoRemote","i",actionGoToR), /* go to destination in new file */ |
pascal@18440 | 1509 GB_CONSTANT("Launch","i",actionLaunch), /* launch app or open doc. */ |
pascal@18440 | 1510 GB_CONSTANT("Uri","i",actionURI), /* URI */ |
pascal@18440 | 1511 GB_CONSTANT("Named","i",actionNamed), /* named action*/ |
pascal@18440 | 1512 GB_CONSTANT("Movie","i",actionMovie), /* movie action */ |
pascal@18440 | 1513 |
pascal@18440 | 1514 GB_CONSTANT("Normal","i",0), |
pascal@18440 | 1515 GB_CONSTANT("Sideways","i",90), |
pascal@18440 | 1516 GB_CONSTANT("Inverted","i",180), |
pascal@18440 | 1517 GB_CONSTANT("SidewaysInverted","i",270), |
pascal@18440 | 1518 |
pascal@18440 | 1519 GB_METHOD("_new", 0, PDFDOCUMENT_new, "[(File)s]"), |
pascal@18440 | 1520 GB_METHOD("_free", 0, PDFDOCUMENT_free, 0), |
pascal@18440 | 1521 |
pascal@18440 | 1522 GB_METHOD("Open",0,PDFDOCUMENT_open,"(File)s"), |
pascal@18440 | 1523 GB_METHOD("Close",0,PDFDOCUMENT_close,0), |
pascal@18440 | 1524 GB_METHOD("_get",".PdfPage",PDFDOCUMENT_get,"(Index)i"), |
pascal@18440 | 1525 |
pascal@18440 | 1526 GB_PROPERTY("Zoom", "f", PDFDOCUMENT_scale), |
pascal@18440 | 1527 GB_PROPERTY("Orientation", "i", PDFDOCUMENT_rotation), |
pascal@18440 | 1528 |
pascal@18440 | 1529 GB_PROPERTY_READ("Ready","b",PDFDOCUMENT_ready), |
pascal@18440 | 1530 GB_PROPERTY_READ("Count","i",PDFDOCUMENT_count), |
pascal@18440 | 1531 GB_PROPERTY_READ("HasIndex","b",PDFDOCUMENT_has_index), |
pascal@18440 | 1532 GB_PROPERTY_READ("Index",".PdfIndex",PDFDOCUMENT_index), |
pascal@18440 | 1533 GB_PROPERTY_READ("Info",".PdfInfo",PDFDOCUMENT_info), |
pascal@18440 | 1534 |
pascal@18440 | 1535 GB_END_DECLARE |
pascal@18440 | 1536 }; |
pascal@18440 | 1537 |
pascal@18440 | 1538 |