// 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 <http://www.gnu.org/licenses/>.
|
|
|
|
#include <config.h>
|
|
#include <PDFDocEncoding.h>
|
|
#include <Annot.h>
|
|
#include <glib.h>
|
|
#include <glib-object.h>
|
|
#include <poppler-features.h>
|
|
|
|
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<AnnotMarkup *>(POPPLER_ANNOT (poppler_annot)->annot);
|
|
text = (GooString*) annot->getDate ();
|
|
|
|
return text ? _xpoppler_goo_string_to_utf8 (text) : NULL;
|
|
}
|
|
}
|