Esempio n. 1
0
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, "&lt;");
					else if (ch->c == '>')
						fz_printf(out, "&gt;");
					else if (ch->c == '&')
						fz_printf(out, "&amp;");
					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");
}
Esempio n. 2
0
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, "&lt;");
						else if (ch->c == '>')
							fz_printf(out, "&gt;");
						else if (ch->c == '&')
							fz_printf(out, "&amp;");
						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");
}