I've left the appearance stream part aside for now, since we have to fix the problem of annots without AP before.
Attached is a set of patches of what I have done so far. It's safe to push them since they just add new methods. Ok to push? -- Carlos Garcia Campos [email protected] [email protected] http://carlosgc.linups.org PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462
From 687eeb93a45d0f85c591002120582f6b2f50b4aa Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Fri, 29 May 2009 11:43:30 +0200 Subject: [PATCH] Add annot constructors to create annot objects without a dict This allows to create annotation objects to be added to the document. Required fields on the annotation dictionary are constructor arguments, setters will be added for the other fields. --- poppler/Annot.cc | 300 ++++++++++++++++++++++++++++++++++++++++++++++++++++- poppler/Annot.h | 22 ++++- 2 files changed, 315 insertions(+), 7 deletions(-) diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 8654f70..18eff1a 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -37,6 +37,7 @@ #include <stdlib.h> #include <math.h> +#include <assert.h> #include "goo/gmem.h" #include "GooList.h" #include "Error.h" @@ -814,10 +815,35 @@ AnnotAppearanceCharacs::~AnnotAppearanceCharacs() { // Annot //------------------------------------------------------------------------ +Annot::Annot(XRef *xrefA, PDFRectangle *rectA, Catalog *catalog) { + Object obj1; + + flags = flagUnknown; + type = typeUnknown; + + obj1.initArray (xrefA); + Object obj2; + obj1.arrayAdd (obj2.initReal (rectA->x1)); + obj1.arrayAdd (obj2.initReal (rectA->y1)); + obj1.arrayAdd (obj2.initReal (rectA->x2)); + obj1.arrayAdd (obj2.initReal (rectA->y2)); + obj2.free (); + + annotObj.initDict (xrefA); + annotObj.dictSet ("Type", obj2.initName ("Annot")); + annotObj.dictSet ("Rect", &obj1); + // obj1 is owned by the dict + + ref = xrefA->addIndirectObject (&annotObj); + + initialize (xrefA, annotObj.getDict(), catalog); +} + Annot::Annot(XRef *xrefA, Dict *dict, Catalog* catalog) { hasRef = false; flags = flagUnknown; type = typeUnknown; + annotObj.initDict (dict); initialize (xrefA, dict, catalog); } @@ -830,6 +856,7 @@ Annot::Annot(XRef *xrefA, Dict *dict, Catalog* catalog, Object *obj) { } flags = flagUnknown; type = typeUnknown; + annotObj.initDict (dict); initialize (xrefA, dict, catalog); } @@ -842,7 +869,6 @@ void Annot::initialize(XRef *xrefA, Dict *dict, Catalog *catalog) { xref = xrefA; appearBuf = NULL; fontSize = 0; - annotObj.initDict (dict); //----- parse the rectangle rect = new PDFRectangle(); @@ -1220,6 +1246,16 @@ void Annot::draw(Gfx *gfx, GBool printing) { // AnnotPopup //------------------------------------------------------------------------ +AnnotPopup::AnnotPopup(XRef *xrefA, PDFRectangle *rect, Catalog *catalog) : + Annot(xrefA, rect, catalog) { + Object obj1; + + type = typePopup; + + annotObj.dictSet ("Subtype", obj1.initName ("Popup")); + initialize (xrefA, annotObj.getDict(), catalog); +} + AnnotPopup::AnnotPopup(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : Annot(xrefA, dict, catalog, obj) { type = typePopup; @@ -1254,7 +1290,11 @@ void AnnotPopup::initialize(XRef *xrefA, Dict *dict, Catalog *catalog) { //------------------------------------------------------------------------ // AnnotMarkup //------------------------------------------------------------------------ - +AnnotMarkup::AnnotMarkup(XRef *xrefA, PDFRectangle *rect, Catalog *catalog) : + Annot(xrefA, rect, catalog) { + initialize(xrefA, annotObj.getDict(), catalog, &annotObj); +} + AnnotMarkup::AnnotMarkup(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : Annot(xrefA, dict, catalog, obj) { initialize(xrefA, dict, catalog, obj); @@ -1348,6 +1388,17 @@ void AnnotMarkup::initialize(XRef *xrefA, Dict *dict, Catalog *catalog, Object * // AnnotText //------------------------------------------------------------------------ +AnnotText::AnnotText(XRef *xrefA, PDFRectangle *rect, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + type = typeText; + flags |= flagNoZoom | flagNoRotate; + + annotObj.dictSet ("Subtype", obj1.initName ("Text")); + initialize (xrefA, catalog, annotObj.getDict()); +} + AnnotText::AnnotText(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -1444,6 +1495,14 @@ void AnnotText::initialize(XRef *xrefA, Catalog *catalog, Dict *dict) { //------------------------------------------------------------------------ // AnnotLink //------------------------------------------------------------------------ +AnnotLink::AnnotLink(XRef *xrefA, PDFRectangle *rect, Catalog *catalog) : + Annot(xrefA, rect, catalog) { + Object obj1; + + type = typeLink; + annotObj.dictSet ("Subtype", obj1.initName ("Link")); + initialize (xrefA, catalog, annotObj.getDict()); +} AnnotLink::AnnotLink(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : Annot(xrefA, dict, catalog, obj) { @@ -1532,6 +1591,20 @@ void AnnotLink::draw(Gfx *gfx, GBool printing) { //------------------------------------------------------------------------ // AnnotFreeText //------------------------------------------------------------------------ +AnnotFreeText::AnnotFreeText(XRef *xrefA, PDFRectangle *rect, GooString *da, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + type = typeFreeText; + + annotObj.dictSet ("Subtype", obj1.initName ("FreeText")); + + Object obj2; + obj2.initString (da->copy()); + annotObj.dictSet("DA", &obj2); + + initialize (xrefA, catalog, annotObj.getDict()); +} AnnotFreeText::AnnotFreeText(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -1655,6 +1728,24 @@ void AnnotFreeText::initialize(XRef *xrefA, Catalog *catalog, Dict *dict) { // AnnotLine //------------------------------------------------------------------------ +AnnotLine::AnnotLine(XRef *xrefA, PDFRectangle *rect, PDFRectangle *lRect, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + type = typeLine; + annotObj.dictSet ("Subtype", obj1.initName ("Line")); + + Object obj2, obj3; + obj2.initArray (xrefA); + obj2.arrayAdd (obj3.initReal (lRect->x1)); + obj2.arrayAdd (obj3.initReal (lRect->y1)); + obj2.arrayAdd (obj3.initReal (lRect->x2)); + obj2.arrayAdd (obj3.initReal (lRect->y2)); + annotObj.dictSet ("L", &obj2); + + initialize (xrefA, catalog, annotObj.getDict()); +} + AnnotLine::AnnotLine(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { type = typeLine; @@ -1814,6 +1905,48 @@ void AnnotLine::initialize(XRef *xrefA, Catalog *catalog, Dict *dict) { //------------------------------------------------------------------------ // AnnotTextMarkup //------------------------------------------------------------------------ +AnnotTextMarkup::AnnotTextMarkup(XRef *xrefA, PDFRectangle *rect, AnnotSubtype subType, + AnnotQuadrilaterals *quadPoints, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + switch (subType) { + case typeHighlight: + annotObj.dictSet ("Subtype", obj1.initName ("Highlight")); + break; + case typeUnderline: + annotObj.dictSet ("Subtype", obj1.initName ("Underline")); + break; + case typeSquiggly: + annotObj.dictSet ("Subtype", obj1.initName ("Squiggly")); + break; + case typeStrikeOut: + annotObj.dictSet ("Subtype", obj1.initName ("StrikeOut")); + break; + default: + assert (0 && "Invalid subtype for AnnotTextMarkup\n"); + } + + Object obj2; + obj2.initArray (xrefA); + + for (int i = 0; i < quadPoints->getQuadrilateralsLength(); ++i) { + Object obj3; + + obj2.arrayAdd (obj3.initReal (quadPoints->getX1(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getY1(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getX2(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getY2(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getX3(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getY3(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getX4(i))); + obj2.arrayAdd (obj3.initReal (quadPoints->getY4(i))); + } + + annotObj.dictSet ("QuadPoints", &obj2); + + initialize(xrefA, catalog, annotObj.getDict()); +} AnnotTextMarkup::AnnotTextMarkup(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -3208,7 +3341,19 @@ void AnnotWidget::draw(Gfx *gfx, GBool printing) { //------------------------------------------------------------------------ // AnnotMovie //------------------------------------------------------------------------ - +AnnotMovie::AnnotMovie(XRef *xrefA, PDFRectangle *rect, Movie *movieA, Catalog *catalog) : + Annot(xrefA, rect, catalog) { + Object obj1; + + type = typeMovie; + annotObj.dictSet ("Subtype", obj1.initName ("Movie")); + + movie = movieA->copy(); + // TODO: create movie dict from movieA + + initialize(xrefA, catalog, annotObj.getDict()); +} + AnnotMovie::AnnotMovie(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : Annot(xrefA, dict, catalog, obj) { type = typeMovie; @@ -3473,7 +3618,16 @@ void AnnotMovie::getZoomFactor(int& num, int& denum) { //------------------------------------------------------------------------ // AnnotScreen //------------------------------------------------------------------------ - +AnnotScreen::AnnotScreen(XRef *xrefA, PDFRectangle *rect, Catalog *catalog) : + Annot(xrefA, rect, catalog) { + Object obj1; + + type = typeScreen; + + annotObj.dictSet ("Subtype", obj1.initName ("Screen")); + initialize(xrefA, catalog, annotObj.getDict()); +} + AnnotScreen::AnnotScreen(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : Annot(xrefA, dict, catalog, obj) { type = typeScreen; @@ -3514,7 +3668,15 @@ void AnnotScreen::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) { //------------------------------------------------------------------------ // AnnotStamp //------------------------------------------------------------------------ - +AnnotStamp::AnnotStamp(XRef *xrefA, PDFRectangle *rect, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + type = typeStamp; + annotObj.dictSet ("Subtype", obj1.initName ("Stamp")); + initialize(xrefA, catalog, annotObj.getDict()); +} + AnnotStamp::AnnotStamp(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { type = typeStamp; @@ -3540,6 +3702,23 @@ void AnnotStamp::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) { //------------------------------------------------------------------------ // AnnotGeometry //------------------------------------------------------------------------ +AnnotGeometry::AnnotGeometry(XRef *xrefA, PDFRectangle *rect, AnnotSubtype subType, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + switch (subType) { + case typeSquare: + annotObj.dictSet ("Subtype", obj1.initName ("Square")); + break; + case typeCircle: + annotObj.dictSet ("Subtype", obj1.initName ("Circle")); + break; + default: + assert (0 && "Invalid subtype for AnnotGeometry\n"); + } + + initialize(xrefA, catalog, annotObj.getDict()); +} AnnotGeometry::AnnotGeometry(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -3592,6 +3771,36 @@ void AnnotGeometry::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) { //------------------------------------------------------------------------ // AnnotPolygon //------------------------------------------------------------------------ +AnnotPolygon::AnnotPolygon(XRef *xrefA, PDFRectangle *rect, AnnotSubtype subType, + AnnotPath *path, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + switch (subType) { + case typePolygon: + annotObj.dictSet ("Subtype", obj1.initName ("Polygon")); + break; + case typePolyLine: + annotObj.dictSet ("Subtype", obj1.initName ("PolyLine")); + break; + default: + assert (0 && "Invalid subtype for AnnotGeometry\n"); + } + + Object obj2; + obj2.initArray (xrefA); + + for (int i = 0; i < path->getCoordsLength(); ++i) { + Object obj3; + + obj2.arrayAdd (obj3.initReal (path->getX(i))); + obj2.arrayAdd (obj3.initReal (path->getY(i))); + } + + annotObj.dictSet ("Vertices", &obj2); + + initialize(xrefA, catalog, annotObj.getDict()); +} AnnotPolygon::AnnotPolygon(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -3686,6 +3895,15 @@ void AnnotPolygon::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) { //------------------------------------------------------------------------ // AnnotCaret //------------------------------------------------------------------------ +AnnotCaret::AnnotCaret(XRef *xrefA, PDFRectangle *rect, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + type = typeCaret; + + annotObj.dictSet ("Subtype", obj1.initName ("Caret")); + initialize(xrefA, catalog, annotObj.getDict()); +} AnnotCaret::AnnotCaret(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -3723,6 +3941,36 @@ void AnnotCaret::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) { //------------------------------------------------------------------------ // AnnotInk //------------------------------------------------------------------------ +AnnotInk::AnnotInk(XRef *xrefA, PDFRectangle *rect, AnnotPath **paths, int n_paths, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + type = typeInk; + + annotObj.dictSet ("Subtype", obj1.initName ("Ink")); + + Object obj2; + obj2.initArray (xrefA); + + for (int i = 0; i < n_paths; ++i) { + AnnotPath *path = paths[i]; + Object obj3; + obj3.initArray (xrefA); + + for (int j = 0; j < path->getCoordsLength(); ++j) { + Object obj4; + + obj3.arrayAdd (obj4.initReal (path->getX(j))); + obj3.arrayAdd (obj4.initReal (path->getY(j))); + } + + obj2.arrayAdd (&obj3); + } + + annotObj.dictSet ("InkList", &obj2); + + initialize(xrefA, catalog, annotObj.getDict()); +} AnnotInk::AnnotInk(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -3764,6 +4012,20 @@ void AnnotInk::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) { //------------------------------------------------------------------------ // AnnotFileAttachment //------------------------------------------------------------------------ +AnnotFileAttachment::AnnotFileAttachment(XRef *xrefA, PDFRectangle *rect, GooString *filename, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + type = typeFileAttachment; + + annotObj.dictSet ("Subtype", obj1.initName ("FileAttachment")); + + Object obj2; + obj2.initString(filename->copy()); + annotObj.dictSet ("FS", &obj2); + + initialize(xrefA, catalog, annotObj.getDict()); +} AnnotFileAttachment::AnnotFileAttachment(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -3781,7 +4043,7 @@ AnnotFileAttachment::~AnnotFileAttachment() { void AnnotFileAttachment::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) { Object obj1; - if (dict->lookup("FS", &obj1)->isDict()) { + if (dict->lookup("FS", &obj1)->isDict() || dict->lookup("FS", &obj1)->isString()) { obj1.copy(&file); } else { error(-1, "Bad Annot File Attachment"); @@ -3800,6 +4062,22 @@ void AnnotFileAttachment::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) //------------------------------------------------------------------------ // AnnotSound //------------------------------------------------------------------------ +AnnotSound::AnnotSound(XRef *xrefA, PDFRectangle *rect, Sound *soundA, Catalog *catalog) : + AnnotMarkup(xrefA, rect, catalog) { + Object obj1; + + type = typeSound; + + annotObj.dictSet ("Subtype", obj1.initName ("Sound")); + + Object obj2; + Stream *str = soundA->getStream(); + obj2.initStream (str); + str->incRef(); //FIXME: initStream should do this? + annotObj.dictSet ("Sound", &obj2); + + initialize(xrefA, catalog, annotObj.getDict()); +} AnnotSound::AnnotSound(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : AnnotMarkup(xrefA, dict, catalog, obj) { @@ -3834,6 +4112,16 @@ void AnnotSound::initialize(XRef *xrefA, Catalog *catalog, Dict* dict) { //------------------------------------------------------------------------ // Annot3D //------------------------------------------------------------------------ +Annot3D::Annot3D(XRef *xrefA, PDFRectangle *rect, Catalog *catalog) : + Annot(xrefA, rect, catalog) { + Object obj1; + + type = type3D; + + annotObj.dictSet ("Subtype", obj1.initName ("3D")); + + initialize(xrefA, catalog, annotObj.getDict()); +} Annot3D::Annot3D(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : Annot(xrefA, dict, catalog, obj) { diff --git a/poppler/Annot.h b/poppler/Annot.h index 5d9aad1..52f1940 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -480,7 +480,8 @@ public: type3D // 3D 25 }; - Annot(XRef *xrefA, Dict *dict, Catalog* catalog); + Annot(XRef *xrefA, PDFRectangle *rectA, Catalog *catalog); + Annot(XRef *xrefA, Dict *dict, Catalog *catalog); Annot(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); virtual ~Annot(); GBool isOk() { return ok; } @@ -572,6 +573,7 @@ protected: class AnnotPopup: public Annot { public: + AnnotPopup(XRef *xrefA, PDFRectangle *rect, Catalog *catalog); AnnotPopup(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotPopup(); @@ -596,6 +598,7 @@ public: replyTypeGroup // Group }; + AnnotMarkup(XRef *xrefA, PDFRectangle *rect, Catalog *catalog); AnnotMarkup(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); virtual ~AnnotMarkup(); @@ -647,6 +650,7 @@ public: stateNone // None }; + AnnotText(XRef *xrefA, PDFRectangle *rect, Catalog *catalog); AnnotText(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotText(); @@ -693,6 +697,7 @@ class AnnotMovie: public Annot { int units_per_second; // 0 : defined by movie }; + AnnotMovie(XRef *xrefA, PDFRectangle *rect, Movie *movieA, Catalog *catalog); AnnotMovie(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotMovie(); @@ -766,6 +771,7 @@ class AnnotMovie: public Annot { class AnnotScreen: public Annot { public: + AnnotScreen(XRef *xrefA, PDFRectangle *rect, Catalog *catalog); AnnotScreen(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotScreen(); @@ -801,6 +807,7 @@ public: effectPush // P }; + AnnotLink(XRef *xrefA, PDFRectangle *rect, Catalog *catalog); AnnotLink(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); virtual ~AnnotLink(); @@ -844,6 +851,7 @@ public: intentFreeTextTypeWriter // FreeTextTypeWriter }; + AnnotFreeText(XRef *xrefA, PDFRectangle *rect, GooString *da, Catalog *catalog); AnnotFreeText(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotFreeText(); @@ -895,6 +903,7 @@ public: captionPosTop // Top }; + AnnotLine(XRef *xrefA, PDFRectangle *rect, PDFRectangle *lRect, Catalog *catalog); AnnotLine(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotLine(); @@ -947,6 +956,8 @@ protected: class AnnotTextMarkup: public AnnotMarkup { public: + AnnotTextMarkup(XRef *xrefA, PDFRectangle *rect, AnnotSubtype subType, + AnnotQuadrilaterals *quadPoints, Catalog *catalog); AnnotTextMarkup(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); virtual ~AnnotTextMarkup(); @@ -966,6 +977,7 @@ protected: class AnnotStamp: public AnnotMarkup { public: + AnnotStamp(XRef *xrefA, PDFRectangle *rect, Catalog *catalog); AnnotStamp(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotStamp(); @@ -986,6 +998,7 @@ private: class AnnotGeometry: public AnnotMarkup { public: + AnnotGeometry(XRef *xrefA, PDFRectangle *rect, AnnotSubtype subType, Catalog *catalog); AnnotGeometry(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotGeometry(); @@ -1016,6 +1029,8 @@ public: polygonDimension // PolygonDimension }; + AnnotPolygon(XRef *xrefA, PDFRectangle *rect, AnnotSubtype subType, + AnnotPath *path, Catalog *catalog); AnnotPolygon(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotPolygon(); @@ -1057,6 +1072,7 @@ public: symbolP // P }; + AnnotCaret(XRef *xrefA, PDFRectangle *rect, Catalog *catalog); AnnotCaret(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotCaret(); @@ -1079,6 +1095,7 @@ private: class AnnotInk: public AnnotMarkup { public: + AnnotInk(XRef *xrefA, PDFRectangle *rect, AnnotPath **paths, int n_paths, Catalog *catalog); AnnotInk(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotInk(); @@ -1106,6 +1123,7 @@ private: class AnnotFileAttachment: public AnnotMarkup { public: + AnnotFileAttachment(XRef *xrefA, PDFRectangle *rect, GooString *filename, Catalog *catalog); AnnotFileAttachment(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotFileAttachment(); @@ -1131,6 +1149,7 @@ private: class AnnotSound: public AnnotMarkup { public: + AnnotSound(XRef *xrefA, PDFRectangle *rect, Sound *soundA, Catalog *catalog); AnnotSound(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotSound(); @@ -1251,6 +1270,7 @@ class Annot3D: public Annot { }; public: + Annot3D(XRef *xrefA, PDFRectangle *rect, Catalog *catalog); Annot3D(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~Annot3D(); -- 1.6.0.4
From bf33d5a0d0080465e7c749c38aca1709379f908d Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Fri, 29 May 2009 12:14:02 +0200 Subject: [PATCH] Save page object and ref in Page class This is needed to be able to modify the page object. --- poppler/Catalog.cc | 2 +- poppler/Page.cc | 6 +++++- poppler/Page.h | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/poppler/Catalog.cc b/poppler/Catalog.cc index a48639f..9a18e24 100644 --- a/poppler/Catalog.cc +++ b/poppler/Catalog.cc @@ -309,7 +309,7 @@ int Catalog::readPageTree(Dict *pagesDict, PageAttrs *attrs, int start, kids.arrayGet(i, &kid); if (kid.isDict("Page")) { attrs2 = new PageAttrs(attrs1, kid.getDict()); - page = new Page(xref, start+1, kid.getDict(), attrs2, form); + page = new Page(xref, start+1, kid.getDict(), kidRef.getRef(), attrs2, form); if (!page->isOk()) { ++start; goto err3; diff --git a/poppler/Page.cc b/poppler/Page.cc index 40cb6d9..67d93e0 100644 --- a/poppler/Page.cc +++ b/poppler/Page.cc @@ -252,7 +252,7 @@ GBool PageAttrs::readBox(Dict *dict, char *key, PDFRectangle *box) { // Page //------------------------------------------------------------------------ -Page::Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA, Form *form) { +Page::Page(XRef *xrefA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form) { Object tmp; ok = gTrue; @@ -261,6 +261,9 @@ Page::Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA, Form *form) duration = -1; pageWidgets = NULL; + pageObj.initDict(pageDict); + pageRef = pageRefA; + // get attributes attrs = attrsA; @@ -334,6 +337,7 @@ Page::Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA, Form *form) Page::~Page() { delete pageWidgets; delete attrs; + pageObj.free(); annots.free(); contents.free(); trans.free(); diff --git a/poppler/Page.h b/poppler/Page.h index 6116083..103a544 100644 --- a/poppler/Page.h +++ b/poppler/Page.h @@ -126,7 +126,7 @@ class Page { public: // Constructor. - Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA, Form *form); + Page(XRef *xrefA, int numA, Dict *pageDict, Ref pageRefA, PageAttrs *attrsA, Form *form); // Destructor. ~Page(); @@ -235,6 +235,8 @@ public: private: XRef *xref; // the xref table for this PDF file + Object pageObj; // page dictionary + Ref pageRef; // page reference int num; // page number PageAttrs *attrs; // page attributes Object annots; // annotations array -- 1.6.0.4
From 0d78f6b13e9f5158c86e8a404f06bfb0edfa548b Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Fri, 29 May 2009 13:00:19 +0200 Subject: [PATCH] Add getRef() to get the annotation reference --- poppler/Annot.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/poppler/Annot.h b/poppler/Annot.h index 52f1940..5a845ae 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -503,6 +503,7 @@ public: void setContents(GooString *new_content); // getters + Ref getRef() const { return ref; } AnnotSubtype getType() const { return type; } PDFRectangle *getRect() const { return rect; } GooString *getContents() const { return contents; } -- 1.6.0.4
From 8eb1af915e6e1417d44308d04ba184485c15cc34 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Fri, 29 May 2009 13:06:40 +0200 Subject: [PATCH] Add Page::addAnnot() to add a new annotation to the page --- poppler/Page.cc | 28 ++++++++++++++++++++++++++++ poppler/Page.h | 2 ++ 2 files changed, 30 insertions(+), 0 deletions(-) diff --git a/poppler/Page.cc b/poppler/Page.cc index 67d93e0..3bbfdde 100644 --- a/poppler/Page.cc +++ b/poppler/Page.cc @@ -354,6 +354,34 @@ Annots *Page::getAnnots(Catalog *catalog) { return annots; } +void Page::addAnnot(Annot *annot) { + Object obj1; + Object tmp; + Ref annotRef = annot->getRef (); + + if (annots.isNull()) { + Ref annotsRef; + // page doesn't have annots array, + // we have to create it + + obj1.initArray(xref); + obj1.arrayAdd(tmp.initRef (annotRef.num, annotRef.gen)); + tmp.free(); + + annotsRef = xref->addIndirectObject (&obj1); + annots.initRef(annotsRef.num, annotsRef.gen); + pageObj.dictSet ("Annots", &annots); + xref->setModifiedObject (&pageObj, pageRef); + } else { + getAnnots(&obj1); + if (obj1.isArray()) { + obj1.arrayAdd (tmp.initRef (annotRef.num, annotRef.gen)); + xref->setModifiedObject (&obj1, annots.getRef()); + } + obj1.free(); + } +} + Links *Page::getLinks(Catalog *catalog) { Links *links; Object obj; diff --git a/poppler/Page.h b/poppler/Page.h index 103a544..9d892b1 100644 --- a/poppler/Page.h +++ b/poppler/Page.h @@ -163,6 +163,8 @@ public: // Get annotations array. Object *getAnnots(Object *obj) { return annots.fetch(xref, obj); } + // Add a new annotation to the page + void addAnnot(Annot *annot); // Return a list of links. Links *getLinks(Catalog *catalog); -- 1.6.0.4
From 395eeaf275dee2a178340a3ad8f0e27a74a54094 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Fri, 29 May 2009 13:23:26 +0200 Subject: [PATCH] Add construtors to create AnnotColor objects directly from color values --- poppler/Annot.cc | 26 ++++++++++++++++++++++++++ poppler/Annot.h | 3 +++ 2 files changed, 29 insertions(+), 0 deletions(-) diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 18eff1a..3d6f250 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -613,6 +613,32 @@ AnnotColor::AnnotColor() { values = NULL; } +AnnotColor::AnnotColor(double gray) { + length = 1; + values = (double *) gmallocn (length, sizeof(double)); + + values[0] = gray; +} + +AnnotColor::AnnotColor(double r, double g, double b) { + length = 3; + values = (double *) gmallocn (length, sizeof(double)); + + values[0] = r; + values[1] = g; + values[2] = b; +} + +AnnotColor::AnnotColor(double c, double m, double y, double k) { + length = 4; + values = (double *) gmallocn (length, sizeof(double)); + + values[0] = c; + values[1] = m; + values[2] = y; + values[3] = k; +} + AnnotColor::AnnotColor(Array *array) { // TODO: check what Acrobat does in the case of having more than 5 numbers. if (array->getLength() < 5) { diff --git a/poppler/Annot.h b/poppler/Annot.h index 5a845ae..cd73068 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -287,6 +287,9 @@ public: }; AnnotColor(); + AnnotColor(double gray); + AnnotColor(double r, double g, double b); + AnnotColor(double c, double m, double y, double k); AnnotColor(Array *array); ~AnnotColor(); -- 1.6.0.4
From 4fdf658d51af6b27ecf79b3a9c9cc79b1fd2f816 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Fri, 29 May 2009 13:35:39 +0200 Subject: [PATCH] Add Annot::setColor() --- poppler/Annot.cc | 19 ++++++++++++++++++- poppler/Annot.h | 6 +++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 3d6f250..0f0267b 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -1070,7 +1070,24 @@ void Annot::setContents(GooString *new_content) { obj1.initString(contents->copy()); update ("Contents", &obj1); } - + +void Annot::setColor(AnnotColor *new_color) { + delete color; + + if (new_color) { + Object obj1, obj2; + double *values = new_color->getValues(); + + obj1.initArray(xref); + for (int i = 0; i < (int)new_color->getSpace(); i++) + obj1.arrayAdd(obj2.initReal (values[i])); + update ("C", &obj1); + color = new_color; + } else { + color = NULL; + } +} + double Annot::getXMin() { return rect->x1; } diff --git a/poppler/Annot.h b/poppler/Annot.h index cd73068..b4d8794 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -504,7 +504,11 @@ public: // Sets the annot contents to new_content // new_content should never be NULL void setContents(GooString *new_content); - + + // The annotation takes the ownership of + // new_color. + void setColor(AnnotColor *new_color); + // getters Ref getRef() const { return ref; } AnnotSubtype getType() const { return type; } -- 1.6.0.4
From 3b2589339a26b02ce95e2ce3844691ae31dadefc Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Mon, 1 Jun 2009 14:52:21 +0200 Subject: [PATCH] Fix a crash in pdf-inspector --- test/pdf-inspector.cc | 11 +++++++++++ 1 files changed, 11 insertions(+), 0 deletions(-) diff --git a/test/pdf-inspector.cc b/test/pdf-inspector.cc index aba4a71..ce09757 100644 --- a/test/pdf-inspector.cc +++ b/test/pdf-inspector.cc @@ -214,6 +214,8 @@ PdfInspector::analyze_page (int page) void *p; GtkWidget *label; char *text; + cairo_t *cr; + cairo_surface_t *surface; label = glade_xml_get_widget (xml, "pdf_total_label"); @@ -221,7 +223,15 @@ PdfInspector::analyze_page (int page) gtk_list_store_clear (GTK_LIST_STORE (model)); GooTimer timer; + surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, + doc->getPageCropWidth(page + 1), + doc->getPageCropHeight(page + 1)); + cr = cairo_create (surface); + cairo_surface_destroy (surface); + output->setCairo (cr); + cairo_destroy (cr); doc->displayPage (output, page + 1, 72, 72, 0, gFalse, gTrue, gTrue); + output->setCairo (NULL); // Total time; text = g_strdup_printf ("%g", timer.getElapsed ()); @@ -331,6 +341,7 @@ main (int argc, char *argv []) globalParams = new GlobalParams(); globalParams->setProfileCommands (true); + globalParams->setPrintCommands (true); if (argc == 2) file_name = argv[1]; -- 1.6.0.4
From 00ab2df08ed30e14c4edd4bf860bcac29dab354d Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Tue, 2 Jun 2009 10:37:49 +0200 Subject: [PATCH] Save parent reference of popup annotations --- poppler/Annot.cc | 16 +++++----------- poppler/Annot.h | 4 ++-- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 0f0267b..e2f4e3e 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -1306,22 +1306,16 @@ AnnotPopup::AnnotPopup(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj) : } AnnotPopup::~AnnotPopup() { - /* - if (parent) - delete parent; - */ + parent.free(); } void AnnotPopup::initialize(XRef *xrefA, Dict *dict, Catalog *catalog) { Object obj1; - /* - if (dict->lookup("Parent", &obj1)->isDict()) { - parent = NULL; - } else { - parent = NULL; + + if (!dict->lookupNF("Parent", &parent)->isRef()) { + parent.initNull(); } - obj1.free(); - */ + if (dict->lookup("Open", &obj1)->isBool()) { open = obj1.getBool(); } else { diff --git a/poppler/Annot.h b/poppler/Annot.h index b4d8794..f1b53cd 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -585,13 +585,13 @@ public: AnnotPopup(XRef *xrefA, Dict *dict, Catalog *catalog, Object *obj); ~AnnotPopup(); - Dict *getParent() const { return parent; } + Object *getParent(Object *obj) { return parent.fetch (xref, obj); } GBool getOpen() const { return open; } protected: void initialize(XRef *xrefA, Dict *dict, Catalog *catalog); - Dict *parent; // Parent + Object parent; // Parent GBool open; // Open }; -- 1.6.0.4
From 016410e1aaa0b490a0967b3ca060f75b997762e0 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Tue, 2 Jun 2009 10:59:44 +0200 Subject: [PATCH] Add setParent() and setOpen() to AnnotPopup --- poppler/Annot.cc | 19 +++++++++++++++++++ poppler/Annot.h | 4 ++++ 2 files changed, 23 insertions(+), 0 deletions(-) diff --git a/poppler/Annot.cc b/poppler/Annot.cc index e2f4e3e..78b4f11 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -1324,6 +1324,25 @@ void AnnotPopup::initialize(XRef *xrefA, Dict *dict, Catalog *catalog) { obj1.free(); } +void AnnotPopup::setParent(Object *parentA) { + parentA->copy(&parent); + update ("Parent", &parent); +} + +void AnnotPopup::setParent(Annot *parentA) { + Ref parentRef = parentA->getRef(); + parent.initRef(parentRef.num, parentRef.gen); + update ("Parent", &parent); +} + +void AnnotPopup::setOpen(GBool openA) { + Object obj1; + + open = openA; + obj1.initBool(open); + update ("Open", &obj1); +} + //------------------------------------------------------------------------ // AnnotMarkup //------------------------------------------------------------------------ diff --git a/poppler/Annot.h b/poppler/Annot.h index f1b53cd..9c55aee 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -586,7 +586,11 @@ public: ~AnnotPopup(); Object *getParent(Object *obj) { return parent.fetch (xref, obj); } + Object *getParentNF(Object *obj) { return &parent; } + void setParent(Object *parentA); + void setParent(Annot *parentA); GBool getOpen() const { return open; } + void setOpen(GBool openA); protected: void initialize(XRef *xrefA, Dict *dict, Catalog *catalog); -- 1.6.0.4
From 1ec10f50b39ceb8fc7149ffdf26db2f34ac1d595 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Tue, 2 Jun 2009 11:26:40 +0200 Subject: [PATCH] Add setLabel() and setPopup() to AnnotMarkup --- poppler/Annot.cc | 36 ++++++++++++++++++++++++++++++++++++ poppler/Annot.h | 4 ++++ 2 files changed, 40 insertions(+), 0 deletions(-) diff --git a/poppler/Annot.cc b/poppler/Annot.cc index 78b4f11..b8f9b18 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -1440,6 +1440,42 @@ void AnnotMarkup::initialize(XRef *xrefA, Dict *dict, Catalog *catalog, Object * obj1.free(); } +void AnnotMarkup::setLabel(GooString *new_label) { + delete label; + + if (new_label) { + label = new GooString(new_label); + //append the unicode marker <FE FF> if needed + if (!label->hasUnicodeMarker()) { + label->insert(0, 0xff); + label->insert(0, 0xfe); + } + } else { + label = new GooString(); + } + + Object obj1; + obj1.initString(label->copy()); + update ("T", &obj1); +} + +void AnnotMarkup::setPopup(AnnotPopup *new_popup) { + delete popup; + + if (new_popup) { + Object obj1; + Ref popupRef = new_popup->getRef(); + + obj1.initRef (popupRef.num, popupRef.gen); + update ("Popup", &obj1); + + new_popup->setParent(this); + popup = new_popup; + } else { + popup = NULL; + } +} + //------------------------------------------------------------------------ // AnnotText //------------------------------------------------------------------------ diff --git a/poppler/Annot.h b/poppler/Annot.h index 9c55aee..ab45daf 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -625,6 +625,10 @@ public: AnnotMarkupReplyType getReplyTo() const { return replyTo; } AnnotExternalDataType getExData() const { return exData; } + // The annotation takes the ownership of new_popup + void setPopup(AnnotPopup *new_popup); + void setLabel(GooString *new_label); + protected: GooString *label; // T (Default autor) AnnotPopup *popup; // Popup -- 1.6.0.4
From 92ea7cad50c27802d3d3ba9761963d144725a5b1 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos <[email protected]> Date: Tue, 2 Jun 2009 11:44:08 +0200 Subject: [PATCH] Add setOpen() and setIcon() in AnnotText --- poppler/Annot.cc | 25 +++++++++++++++++++++++++ poppler/Annot.h | 3 +++ 2 files changed, 28 insertions(+), 0 deletions(-) diff --git a/poppler/Annot.cc b/poppler/Annot.cc index b8f9b18..b3dd9a1 100644 --- a/poppler/Annot.cc +++ b/poppler/Annot.cc @@ -1584,6 +1584,31 @@ void AnnotText::initialize(XRef *xrefA, Catalog *catalog, Dict *dict) { obj1.free(); } +void AnnotText::setOpen(GBool openA) { + Object obj1; + + open = openA; + obj1.initBool(open); + update ("Open", &obj1); +} + +void AnnotText::setIcon(GooString *new_icon) { + if (new_icon && icon->cmp(new_icon) == 0) + return; + + delete icon; + + if (new_icon) { + icon = new GooString (new_icon); + } else { + icon = new GooString("Note"); + } + + Object obj1; + obj1.initName (icon->getCString()); + update("Name", &obj1); +} + //------------------------------------------------------------------------ // AnnotLink //------------------------------------------------------------------------ diff --git a/poppler/Annot.h b/poppler/Annot.h index ab45daf..b83c1db 100644 --- a/poppler/Annot.h +++ b/poppler/Annot.h @@ -675,6 +675,9 @@ public: GooString *getIcon() const { return icon; } AnnotTextState getState() const { return state; } + void setOpen(GBool openA); + void setIcon(GooString *new_icon); + private: void initialize(XRef *xrefA, Catalog *catalog, Dict *dict); -- 1.6.0.4
signature.asc
Description: Esta parte del mensaje está firmada digitalmente
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
