summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/pdf_bridge.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/pdf_bridge.c b/src/pdf_bridge.c
index 6fdab46c..594db0f9 100644
--- a/src/pdf_bridge.c
+++ b/src/pdf_bridge.c
@@ -940,6 +940,31 @@ pardes_pdf_highlight_rows(
return PARDES_PDF_OK;
}
+/* A page's text, a line of it a line of the result: MuPDF's own buffer
+ * joins a block's lines with spaces, which ran a heading into the
+ * paragraph under it. Structure blocks are walked into. */
+static void
+pardes_append_stext_blocks(fz_context *ctx, fz_buffer *buffer, fz_stext_block *block)
+{
+ for (; block != NULL; block = block->next)
+ {
+ if (block->type == FZ_STEXT_BLOCK_STRUCT)
+ {
+ if (block->u.s.down != NULL)
+ pardes_append_stext_blocks(ctx, buffer, block->u.s.down->first_block);
+ continue;
+ }
+ if (block->type != FZ_STEXT_BLOCK_TEXT)
+ continue;
+ for (fz_stext_line *line = block->u.t.first_line; line != NULL; line = line->next)
+ {
+ for (fz_stext_char *ch = line->first_char; ch != NULL; ch = ch->next)
+ fz_append_rune(ctx, buffer, ch->c);
+ fz_append_byte(ctx, buffer, '\n');
+ }
+ }
+}
+
int
pardes_pdf_page_text(
pardes_pdf_document *document,
@@ -961,7 +986,8 @@ pardes_pdf_page_text(
fz_try(ctx)
{
pardes_pdf_cache_page(document, page_number, 1);
- buffer = fz_new_buffer_from_stext_page(ctx, document->cached_text);
+ buffer = fz_new_buffer(ctx, 1024);
+ pardes_append_stext_blocks(ctx, buffer, document->cached_text->first_block);
len = fz_buffer_storage(ctx, buffer, &data);
}
fz_catch(ctx)