// Copyright (C) 2013, 2014 Andreas Politz // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include #include #include #include #include #include extern "C" { GType poppler_annot_get_type (void) G_GNUC_CONST; GType poppler_annot_markup_get_type (void) G_GNUC_CONST; #define POPPLER_TYPE_ANNOT (poppler_annot_get_type ()) #define POPPLER_ANNOT(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), POPPLER_TYPE_ANNOT, PopplerAnnot)) #define POPPLER_IS_ANNOT_MARKUP(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), POPPLER_TYPE_ANNOT_MARKUP)) #define POPPLER_TYPE_ANNOT_MARKUP (poppler_annot_markup_get_type ()) #if POPPLER_CHECK_VERSION(0,72,0) #define GET_CSTR c_str #else #define GET_CSTR getCString #endif struct PopplerAnnot { GObject parent_instance; Annot *annot; }; struct PopplerAnnotMarkup { GObject parent_instance; }; struct PopplerRectangle { double x1; double y1; double x2; double y2; }; // This function does not modify its argument s, but for // compatibility reasons (e.g. getLength in GooString.h before 2015) // with older poppler code, it can't be declared as such. char *_xpoppler_goo_string_to_utf8(/* const */ GooString *s) { char *result; if (! s) return NULL; if (s->hasUnicodeMarker()) { result = g_convert (s->GET_CSTR () + 2, s->getLength () - 2, "UTF-8", "UTF-16BE", NULL, NULL, NULL); } else { int len; gunichar *ucs4_temp; int i; len = s->getLength (); ucs4_temp = g_new (gunichar, len + 1); for (i = 0; i < len; ++i) { ucs4_temp[i] = pdfDocEncoding[(unsigned char)s->getChar(i)]; } ucs4_temp[i] = 0; result = g_ucs4_to_utf8 (ucs4_temp, -1, NULL, NULL, NULL); g_free (ucs4_temp); } return result; } #ifdef HAVE_POPPLER_ANNOT_WRITE // Set the rectangle of an annotation. It was first added in v0.26. void xpoppler_annot_set_rectangle (PopplerAnnot *a, PopplerRectangle *rectangle) { GooString *state = (GooString*) a->annot->getAppearState (); char *ustate = _xpoppler_goo_string_to_utf8 (state); a->annot->setRect (rectangle->x1, rectangle->y1, rectangle->x2, rectangle->y2); a->annot->setAppearanceState (ustate); g_free (ustate); } #endif // This function is in the library, but the enforced date parsing is // incomplete (at least in some versions), because it ignores the // timezone. gchar *xpoppler_annot_markup_get_created (PopplerAnnotMarkup *poppler_annot) { AnnotMarkup *annot; GooString *text; g_return_val_if_fail (POPPLER_IS_ANNOT_MARKUP (poppler_annot), NULL); annot = static_cast(POPPLER_ANNOT (poppler_annot)->annot); text = (GooString*) annot->getDate (); return text ? _xpoppler_goo_string_to_utf8 (text) : NULL; } }