void fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page) { int block_n, line_n, span_n, ch_n; fz_text_style *style = NULL; fz_text_block *block; fz_text_line *line; fz_text_span *span; fz_printf(out, "<div class=\"page\">\n"); for (block_n = 0; block_n < page->len; block_n++) { block = &page->blocks[block_n]; fz_printf(out, "<div class=\"block\"><p>\n"); for (line_n = 0; line_n < block->len; line_n++) { line = &block->lines[line_n]; fz_printf(out, "<span>"); style = NULL; for (span_n = 0; span_n < line->len; span_n++) { span = &line->spans[span_n]; if (style != span->style) { if (style) fz_print_style_end(out, style); fz_print_style_begin(out, span->style); style = span->style; } for (ch_n = 0; ch_n < span->len; ch_n++) { fz_text_char *ch = &span->text[ch_n]; if (ch->c == '<') fz_printf(out, "<"); else if (ch->c == '>') fz_printf(out, ">"); else if (ch->c == '&') fz_printf(out, "&"); else if (ch->c >= 32 && ch->c <= 127) fz_printf(out, "%c", ch->c); else fz_printf(out, "&#x%x;", ch->c); } } if (style) fz_print_style_end(out, style); fz_printf(out, "</span>\n"); } fz_printf(out, "</p></div>\n"); } fz_printf(out, "</div>\n"); }
void fz_print_text_page_html(fz_context *ctx, fz_output *out, fz_text_page *page) { int block_n, line_n, ch_n; fz_text_style *style = NULL; fz_text_line *line; fz_text_span *span; void *last_region = NULL; fz_printf(out, "<div class=\"page\">\n"); for (block_n = 0; block_n < page->len; block_n++) { switch (page->blocks[block_n].type) { case FZ_PAGE_BLOCK_TEXT: { fz_text_block * block = page->blocks[block_n].u.text; fz_printf(out, "<div class=\"block\"><p>\n"); for (line_n = 0; line_n < block->len; line_n++) { int lastcol=-1; line = &block->lines[line_n]; style = NULL; if (line->region != last_region) { if (last_region) fz_printf(out, "</div>"); fz_printf(out, "<div class=\"metaline\">"); last_region = line->region; } fz_printf(out, "<div class=\"line\""); #ifdef DEBUG_INTERNALS if (line->region) fz_printf(out, " region=\"%x\"", line->region); #endif fz_printf(out, ">"); for (span = line->first_span; span; span = span->next) { float size = fz_matrix_expansion(&span->transform); float base_offset = span->base_offset / size; if (lastcol != span->column) { if (lastcol >= 0) { fz_printf(out, "</div>"); } /* If we skipped any columns then output some spacer spans */ while (lastcol < span->column-1) { fz_printf(out, "<div class=\"cell\"></div>"); lastcol++; } lastcol++; /* Now output the span to contain this entire column */ fz_printf(out, "<div class=\"cell\" style=\""); { fz_text_span *sn; for (sn = span->next; sn; sn = sn->next) { if (sn->column != lastcol) break; } fz_printf(out, "width:%g%%;align:%s", span->column_width, (span->align == 0 ? "left" : (span->align == 1 ? "center" : "right"))); } if (span->indent > 1) fz_printf(out, ";padding-left:1em;text-indent:-1em"); if (span->indent < -1) fz_printf(out, ";text-indent:1em"); fz_printf(out, "\">"); } #ifdef DEBUG_INTERNALS fz_printf(out, "<span class=\"internal_span\""); if (span->column) fz_printf(out, " col=\"%x\"", span->column); fz_printf(out, ">"); #endif if (span->spacing >= 1) fz_printf(out, " "); if (base_offset > SUBSCRIPT_OFFSET) fz_printf(out, "<sub>"); else if (base_offset < SUPERSCRIPT_OFFSET) fz_printf(out, "<sup>"); for (ch_n = 0; ch_n < span->len; ch_n++) { fz_text_char *ch = &span->text[ch_n]; if (style != ch->style) { if (style) fz_print_style_end(out, style); fz_print_style_begin(out, ch->style); style = ch->style; } if (ch->c == '<') fz_printf(out, "<"); else if (ch->c == '>') fz_printf(out, ">"); else if (ch->c == '&') fz_printf(out, "&"); else if (ch->c >= 32 && ch->c <= 127) fz_printf(out, "%c", ch->c); else fz_printf(out, "&#x%x;", ch->c); } if (style) { fz_print_style_end(out, style); style = NULL; } if (base_offset > SUBSCRIPT_OFFSET) fz_printf(out, "</sub>"); else if (base_offset < SUPERSCRIPT_OFFSET) fz_printf(out, "</sup>"); #ifdef DEBUG_INTERNALS fz_printf(out, "</span>"); #endif } /* Close our floating span */ fz_printf(out, "</div>"); /* Close the line */ fz_printf(out, "</div>"); fz_printf(out, "\n"); } /* Close the metaline */ fz_printf(out, "</div>"); last_region = NULL; fz_printf(out, "</p></div>\n"); break; } case FZ_PAGE_BLOCK_IMAGE: { fz_image_block *image = page->blocks[block_n].u.image; fz_printf(out, "<img width=%d height=%d src=\"data:", image->image->w, image->image->h); switch (image->image->buffer == NULL ? FZ_IMAGE_JPX : image->image->buffer->params.type) { case FZ_IMAGE_JPEG: fz_printf(out, "image/jpeg;base64,"); send_data_base64(out, image->image->buffer->buffer); break; case FZ_IMAGE_PNG: fz_printf(out, "image/png;base64,"); send_data_base64(out, image->image->buffer->buffer); break; default: { fz_buffer *buf = fz_image_as_png(ctx, image->image, image->image->w, image->image->h); fz_printf(out, "image/png;base64,"); send_data_base64(out, buf); fz_drop_buffer(ctx, buf); break; } } fz_printf(out, "\">\n"); break; } } } fz_printf(out, "</div>\n"); }