summaryrefslogtreecommitdiff
path: root/server/epdfinfo.c
diff options
context:
space:
mode:
authorAndreas Politz <politza@hochschule-trier.de>2015-02-12 23:52:42 +0100
committerAndreas Politz <politza@hochschule-trier.de>2015-02-12 23:52:42 +0100
commit27ff02a7aa99eeb93148bd23b2dd73362efda494 (patch)
treed2e8ba2fa26abcb418c88ccb8a9b99549a6c42ec /server/epdfinfo.c
parent5b8f6c22ef9f62ea8141f0c26fe6a9964c5fad74 (diff)
Added charlayout command.
* server/epdfinfo.c (cmd_charlayout): Provides edges of character. * lisp/pdf-info.el (pdf-info-query--transform-response): Added transform. (pdf-info-charlayout): Added interface for the command.
Diffstat (limited to 'server/epdfinfo.c')
-rw-r--r--server/epdfinfo.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/server/epdfinfo.c b/server/epdfinfo.c
index 78f288a..b917e94 100644
--- a/server/epdfinfo.c
+++ b/server/epdfinfo.c
@@ -3119,6 +3119,79 @@ cmd_boundingbox (const epdfinfo_t *ctx, const command_arg_t *args)
if (page) g_object_unref (page);
}
+const command_arg_type_t cmd_charlayout_spec[] =
+ {
+ ARG_DOC,
+ ARG_NATNUM, /* page number */
+ ARG_EDGES_OR_POSITION, /* region or position */
+ };
+
+static void
+cmd_charlayout(const epdfinfo_t *ctx, const command_arg_t *args)
+{
+ PopplerDocument *doc = args[0].value.doc->pdf;
+ int pn = args[1].value.natnum;
+ PopplerRectangle region = args[2].value.rectangle;
+ double width, height;
+ PopplerPage *page = poppler_document_get_page(doc, pn - 1);
+ char *text = NULL;
+ char *text_p;
+ PopplerRectangle *rectangles = NULL;
+ int nrectangles;
+ int i;
+ gboolean have_position = region.y2 < 0;
+
+ perror_if_not (page, "No such page %d", pn);
+
+ text = poppler_page_get_text (page);
+ text_p = text;
+ poppler_page_get_text_layout (page, &rectangles, &nrectangles);
+ poppler_page_get_size (page, &width, &height);
+ region.x1 *= width;
+ region.x2 *= width;
+ region.y1 *= height;
+ region.y2 *= height;
+
+ OK_BEGIN ();
+ for (i = 0; i < nrectangles && *text_p; ++i)
+ {
+ PopplerRectangle *r = &rectangles[i];
+ char *nextc = g_utf8_offset_to_pointer (text_p, 1);
+
+ if ((have_position
+ && region.x1 >= r->x1
+ && region.x1 <= r->x2
+ && region.y1 >= r->y1
+ && region.y1 <= r->y2)
+ || (! have_position
+ && r->x1 >= region.x1
+ && r->y1 >= region.y1
+ && r->x2 <= region.x2
+ && r->y2 <= region.y2))
+ {
+ char endc = *nextc;
+
+ printf ("%f %f %f %f:",
+ r->x1 / width, r->y1 / height,
+ r->x2 / width, r->y2 / height);
+ *nextc = '\0';
+ print_response_string (text_p, NEWLINE);
+ *nextc = endc;
+ }
+ text_p = nextc;
+ }
+ OK_END ();
+
+ g_free (rectangles);
+ g_object_unref (page);
+ g_free (text);
+
+ error:
+ return;
+}
+
+
+
/* ================================================================== *
* Main