// 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;
}
}