diff options
| author | Ben Harris <bjh21@bjh21.me.uk> | 2006-12-09 14:44:47 +0000 |
|---|---|---|
| committer | Ben Harris <bjh21@bjh21.me.uk> | 2006-12-09 14:44:47 +0000 |
| commit | 76b522bc5aac82f7d1c0e3433f1620a7a192bdad (patch) | |
| tree | 3096ba08982d23b7ea63a83649360f490acb20d4 /bk_pdf.c | |
| parent | 92242aeaf21903a4c5a12a7c74eb77fcd7158a52 (diff) | |
| download | halibut-76b522bc5aac82f7d1c0e3433f1620a7a192bdad.zip halibut-76b522bc5aac82f7d1c0e3433f1620a7a192bdad.tar.gz halibut-76b522bc5aac82f7d1c0e3433f1620a7a192bdad.tar.bz2 halibut-76b522bc5aac82f7d1c0e3433f1620a7a192bdad.tar.xz | |
Correct embedding of Type 1 fonts in PDF. Error cases (e.g. invalid Type 1
fonts) may not be well handled, and may emit invalid PDF.
[originally from svn r6974]
Diffstat (limited to 'bk_pdf.c')
| -rw-r--r-- | bk_pdf.c | 37 |
1 files changed, 28 insertions, 9 deletions
@@ -34,6 +34,7 @@ struct objlist_Tag { static object *new_object(objlist *list); static void objtext(object *o, char const *text); static void objstream(object *o, char const *text); +static void objstream_len(object *o, char const *text, size_t len); static void pdf_string(void (*add)(object *, char const *), object *, char const *); static void pdf_string_len(void (*add)(object *, char const *), @@ -237,14 +238,20 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords, objtext(fontdesc, buf); if (fi->fp) { object *fontfile = new_object(&olist); - char buf[513]; size_t len; - rewind(fi->fp); - do { - len = fread(buf, 1, sizeof(buf)-1, fi->fp); - buf[len] = 0; - objstream(fontfile, buf); - } while (len == sizeof(buf)-1); + char *ffbuf; + + pf_part1((font_info *)fi, &ffbuf, &len); + objstream_len(fontfile, ffbuf, len); + sfree(ffbuf); + sprintf(buf, "<<\n/Length1 %lu\n", (unsigned long)len); + objtext(fontfile, buf); + pf_part2((font_info *)fi, &ffbuf, &len); + objstream_len(fontfile, ffbuf, len); + sfree(ffbuf); + sprintf(buf, "/Length2 %lu\n", (unsigned long)len); + objtext(fontfile, buf); + objtext(fontfile, "/Length3 0\n"); objtext(fontdesc, "/FontFile "); objref(fontdesc, fontfile); } @@ -479,12 +486,19 @@ void pdf_backend(paragraph *sourceform, keywordlist *keywords, sprintf(text, "%d 0 obj\n", o->number); rdaddsc(&rs, text); - if (!o->main.text && o->stream.text) { + if (o->stream.text) { + char buf[100]; + sprintf(buf, "stream%06d", o->number); + fp = fopen(buf, "wb"); + fwrite(o->stream.text, 1, o->stream.pos, fp); + fclose(fp); zcontext = deflate_compress_new(DEFLATE_TYPE_ZLIB); deflate_compress_data(zcontext, o->stream.text, o->stream.pos, DEFLATE_END_OF_DATA, &zbuf, &zlen); deflate_compress_free(zcontext); - sprintf(text, "<<\n/Filter/FlateDecode\n/Length %d\n>>\n", zlen); + if (!o->main.text) + rdaddsc(&o->main, "<<\n"); + sprintf(text, "/Filter/FlateDecode\n/Length %d\n>>\n", zlen); rdaddsc(&o->main, text); } @@ -596,6 +610,11 @@ static void objtext(object *o, char const *text) rdaddsc(&o->main, text); } +static void objstream_len(object *o, char const *text, size_t len) +{ + rdaddsn(&o->stream, text, len); +} + static void objstream(object *o, char const *text) { rdaddsc(&o->stream, text); |