diff options
author | Ken Sharp <ken.sharp@artifex.com> | 2010-12-10 13:26:11 +0000 |
---|---|---|
committer | Ken Sharp <ken.sharp@artifex.com> | 2010-12-10 13:26:11 +0000 |
commit | 1e16f0d019ddfcc60bab67650725b7eaf73fdc6a (patch) | |
tree | a672a0c3cb049f595da232aae3460e5a1796f319 | |
parent | ac3dd5e1a390f2f53de4ad3269c78fbeabbc5a90 (diff) |
pdfwrite enhancement : More work towards DSC compliance
This is a resubmission of revision 11941, with some additional changes so that it
doesn't crash with pdfwrite on Linux systems.
We now pass around the 'type' of an object much more when writing. This is so that
we can emit "%%BeginResource/%%EndResource" comment pairs around the resources we write.
It is also required so that we *don't* write these comments around pages.
The code now emits %%BeginProlog, then writes the opdfread.ps procedure. It then writes
all the various resources used in the document, each with a reasonable DSC comment. Then
it writes %%EndProlog. After this come the page descriptions, each is written with a
%%Page: comment and a %%PageTrailer. Finally we write the %%Trailer, %%Pages
comment (NB we write %%Pages: (atend) in the header comments as we don't know how many
pages there will be until the end) and %%EOF.
The resources are mostly defined as being of type 'file', as most of them are not normal
PostScript resources. The DSC specification says under the %%BeginResource definition
(file note on p72) "The enclosed segment is a fragment of PostScript language code or
some other item that does not fall within the other resource categories" and so this
seems the best type to use for our purposes.
The output is now minimally DSC compliant, though there are a few other comments I'd
like to add if possible. Given the way the file is created we are always going to have a
large prolog, and that will need to be copied to all the pages if they are split
individually, in order to make sure that all the required resources are present.
Technically we could follow the resource chain and write %%IncludeResource comments,
at the page level at least, but this is probably more effort than it is realistically
worth.
Still need to add some more DSC comment types, and run some extensive testing.
No differences expected currently. Minimal testing with GSView suggests that the output
so far is DSC-compliant as-is.
git-svn-id: http://svn.ghostscript.com/ghostscript/trunk@11946 a1074d23-0009-0410-80fe-cf8c14f379e6
-rw-r--r-- | gs/base/gdevpdf.c | 41 | ||||
-rw-r--r-- | gs/base/gdevpdfb.c | 8 | ||||
-rw-r--r-- | gs/base/gdevpdfc.c | 4 | ||||
-rw-r--r-- | gs/base/gdevpdfe.c | 4 | ||||
-rw-r--r-- | gs/base/gdevpdfg.c | 12 | ||||
-rw-r--r-- | gs/base/gdevpdfk.c | 2 | ||||
-rw-r--r-- | gs/base/gdevpdfm.c | 18 | ||||
-rw-r--r-- | gs/base/gdevpdfo.c | 8 | ||||
-rw-r--r-- | gs/base/gdevpdfo.h | 4 | ||||
-rw-r--r-- | gs/base/gdevpdfu.c | 227 | ||||
-rw-r--r-- | gs/base/gdevpdfx.h | 52 | ||||
-rw-r--r-- | gs/base/gdevpdtd.c | 6 | ||||
-rw-r--r-- | gs/base/gdevpdti.c | 9 | ||||
-rw-r--r-- | gs/base/gdevpdtw.c | 22 |
14 files changed, 286 insertions, 131 deletions
diff --git a/gs/base/gdevpdf.c b/gs/base/gdevpdf.c index 7834a102d..515350102 100644 --- a/gs/base/gdevpdf.c +++ b/gs/base/gdevpdf.c @@ -932,7 +932,7 @@ pdf_write_page(gx_device_pdf *pdev, int page_num) mediabox[2] = round_box_coord(page->MediaBox.x); mediabox[3] = round_box_coord(page->MediaBox.y); - pdf_open_obj(pdev, page_id); + pdf_open_obj(pdev, page_id, resourcePage); s = pdev->strm; pprintg2(s, "<</Type/Page/MediaBox [0 0 %g %g]\n", mediabox[2], mediabox[3]); @@ -1044,7 +1044,7 @@ pdf_write_page(gx_device_pdf *pdev, int page_num) cos_dict_elements_write(page->Page, pdev); stream_puts(s, ">>\n"); - pdf_end_obj(pdev); + pdf_end_obj(pdev, resourcePage); return 0; } @@ -1197,7 +1197,7 @@ pdf_close(gx_device * dev) /* Create the Pages tree. */ if (!(pdev->ForOPDFRead && pdev->ProduceDSC)) { - pdf_open_obj(pdev, Pages_id); + pdf_open_obj(pdev, Pages_id, resourcePagesTree); s = pdev->strm; stream_puts(s, "<< /Type /Pages /Kids [\n"); /* Omit the last page if it was incomplete. */ @@ -1221,7 +1221,7 @@ pdf_close(gx_device * dev) cos_dict_elements_write(pdev->Pages, pdev); stream_puts(s, ">>\n"); - pdf_end_obj(pdev); + pdf_end_obj(pdev, resourcePagesTree); /* Close outlines and articles. */ @@ -1235,12 +1235,12 @@ pdf_close(gx_device * dev) code = pdfmark_close_outline(pdev); if (code >= 0) code = code1; - pdf_open_obj(pdev, pdev->outlines_id); + pdf_open_obj(pdev, pdev->outlines_id, resourceOutline); pprintd1(s, "<< /Count %d", pdev->outlines_open); pprintld2(s, " /First %ld 0 R /Last %ld 0 R >>\n", pdev->outline_levels[0].first.id, pdev->outline_levels[0].last.id); - pdf_end_obj(pdev); + pdf_end_obj(pdev, resourceOutline); } if (pdev->articles != 0) { pdf_article_t *part; @@ -1253,12 +1253,12 @@ pdf_close(gx_device * dev) /* Write named destinations. (We can't free them yet.) */ if (pdev->Dests) - COS_WRITE_OBJECT(pdev->Dests, pdev); + COS_WRITE_OBJECT(pdev->Dests, pdev, resourceDests); /* Write the PageLabel array */ pdfmark_end_pagelabels(pdev); if (pdev->PageLabels) { - COS_WRITE_OBJECT(pdev->PageLabels, pdev); + COS_WRITE_OBJECT(pdev->PageLabels, pdev, resourceLabels); } /* Write the document metadata. */ @@ -1275,7 +1275,7 @@ pdf_close(gx_device * dev) if (pdev->articles != 0) { pdf_article_t *part; - Threads_id = pdf_begin_obj(pdev); + Threads_id = pdf_begin_obj(pdev, resourceThread); s = pdev->strm; stream_puts(s, "[ "); while ((part = pdev->articles) != 0) { @@ -1285,9 +1285,9 @@ pdf_close(gx_device * dev) gs_free_object(mem, part, "pdf_close(article)"); } stream_puts(s, "]\n"); - pdf_end_obj(pdev); + pdf_end_obj(pdev, resourceThread); } - pdf_open_obj(pdev, Catalog_id); + pdf_open_obj(pdev, Catalog_id, resourceCatalog); s = pdev->strm; stream_puts(s, "<<"); pprintld1(s, "/Type /Catalog /Pages %ld 0 R\n", Pages_id); @@ -1302,7 +1302,7 @@ pdf_close(gx_device * dev) pdev->PageLabels->id); cos_dict_elements_write(pdev->Catalog, pdev); stream_puts(s, ">>\n"); - pdf_end_obj(pdev); + pdf_end_obj(pdev, resourceCatalog); if (pdev->Dests) { COS_FREE(pdev->Dests, "pdf_close(Dests)"); pdev->Dests = 0; @@ -1353,10 +1353,14 @@ pdf_close(gx_device * dev) } if (pdev->ForOPDFRead && pdev->ProduceDSC) { - int j, code = 0; + int j; + code = 0; pagecount = 1; + /* All resources and procsets written, end the prolog */ + stream_puts(pdev->strm, "%%EndProlog\n"); + if (pdev->ResourcesBeforeUsage) pdf_reverse_resource_chain(pdev, resourcePage); for (j = 0; j < NUM_RESOURCE_CHAINS && code >= 0; ++j) { @@ -1366,13 +1370,14 @@ pdf_close(gx_device * dev) if ((!pres->named || pdev->ForOPDFRead) && !pres->object->written) { - pprintd2(pdev->strm, "%%%%Page: %d %d\n", pagecount, pagecount); + pprintd2(pdev->strm, "%%%%Page: %d %d\n/pagesave save def\n", + pagecount, pagecount); pdf_write_page(pdev, pagecount++); pprintld1(pdev->strm, "%ld 0 obj\n", pres->object->id); code = cos_write(pres->object, pdev, pres->object->id); stream_puts(pdev->strm, "endobj\n"); pres->object->written = true; - stream_puts(pdev->strm, "%%PageTrailer\n"); + stream_puts(pdev->strm, "pagesave restore\n%%PageTrailer\n"); } } code1 = pdf_free_resource_objects(pdev, resourcePage); @@ -1385,7 +1390,7 @@ pdf_close(gx_device * dev) if (pdev->OwnerPassword.size > 0) { Encrypt_id = pdf_obj_ref(pdev); - pdf_open_obj(pdev, Encrypt_id); + pdf_open_obj(pdev, Encrypt_id, resourceEncrypt); s = pdev->strm; stream_puts(s, "<<"); stream_puts(s, "/Filter /Standard "); @@ -1398,7 +1403,7 @@ pdf_close(gx_device * dev) stream_puts(s, "\n/U "); pdf_put_string(pdev, pdev->EncryptionU, sizeof(pdev->EncryptionU)); stream_puts(s, ">>\n"); - pdf_end_obj(pdev); + pdf_end_obj(pdev, resourceEncrypt); s = pdev->strm; } @@ -1471,7 +1476,7 @@ pdf_close(gx_device * dev) if (pdev->ForOPDFRead && pdev->ProduceDSC) { stream_puts(pdev->strm, "%%Trailer\n"); - pprintld1(pdev->strm, "%%Pages: %ld\n", pagecount - 1); + pprintld1(pdev->strm, "%%%%Pages: %ld\n", pagecount - 1); stream_puts(pdev->strm, "%%EOF\n"); } if (pdev->ForOPDFRead && pdev->OPDFReadProcsetPath.size) { diff --git a/gs/base/gdevpdfb.c b/gs/base/gdevpdfb.c index 9fe0206be..82bc7c9b4 100644 --- a/gs/base/gdevpdfb.c +++ b/gs/base/gdevpdfb.c @@ -584,7 +584,7 @@ gdev_pdf_strip_tile_rectangle(gx_device * dev, const gx_strip_bitmap * tiles, pprints1(s, "%s\nendstream\n", buf); else pprints1(s, "%sendstream\n", buf); - pdf_end_resource(pdev); + pdf_end_resource(pdev, resourcePattern); } else { length_id = pdf_obj_ref(pdev); pprintld1(s, "%ld 0 R>>stream\n", length_id); @@ -601,10 +601,10 @@ gdev_pdf_strip_tile_rectangle(gx_device * dev, const gx_strip_bitmap * tiles, } end = pdf_stell(pdev); stream_puts(s, "\nendstream\n"); - pdf_end_resource(pdev); - pdf_open_separate(pdev, length_id); + pdf_end_resource(pdev, resourcePattern); + pdf_open_separate(pdev, length_id, resourceNone); pprintld1(pdev->strm, "%ld\n", end - start); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceNone); } pres->object->written = true; /* don't write at end of page */ } diff --git a/gs/base/gdevpdfc.c b/gs/base/gdevpdfc.c index ee4d82ddb..567387ad1 100644 --- a/gs/base/gdevpdfc.c +++ b/gs/base/gdevpdfc.c @@ -1211,7 +1211,7 @@ pdf_color_space_named(gx_device_pdf *pdev, cos_value_t *pvalue, pca->id = pres->object->id; COS_FREE(pres->object, "pdf_color_space"); pres->object = (cos_object_t *)pca; - cos_write_object(COS_OBJECT(pca), pdev); + cos_write_object(COS_OBJECT(pca), pdev, resourceColorSpace); } ret: if (by_name) { @@ -1244,7 +1244,7 @@ pdf_pattern_space(gx_device_pdf *pdev, cos_value_t *pvalue, if (code < 0) return code; pprints1(pdev->strm, "%s\n", cs_name); - pdf_end_resource(pdev); + pdf_end_resource(pdev, resourceColorSpace); (*ppres)->object->written = true; /* don't write at end */ ((pdf_color_space_t *)*ppres)->ranges = 0; ((pdf_color_space_t *)*ppres)->serialized = 0; diff --git a/gs/base/gdevpdfe.c b/gs/base/gdevpdfe.c index 888e49bc5..8c34941be 100644 --- a/gs/base/gdevpdfe.c +++ b/gs/base/gdevpdfe.c @@ -780,7 +780,7 @@ pdf_document_metadata(gx_device_pdf *pdev) s_MD5C_get_digest(pdev->strm, digest, sizeof(digest)); if (pdev->EncryptMetadata) options |= DATA_STREAM_ENCRYPT; - code = pdf_open_aside(pdev, resourceOther, gs_no_id, &pres, true, options); + code = pdf_open_aside(pdev, resourceMetadata, gs_no_id, &pres, true, options); if (code < 0) return code; code = cos_dict_put_c_key_string((cos_dict_t *)pres->object, "/Type", (const byte *)"/Metadata", 9); @@ -795,7 +795,7 @@ pdf_document_metadata(gx_device_pdf *pdev) code = pdf_close_aside(pdev); if (code < 0) return code; - code = COS_WRITE_OBJECT(pres->object, pdev); + code = COS_WRITE_OBJECT(pres->object, pdev, resourceNone); if (code < 0) return code; sprintf(buf, "%ld 0 R", pres->object->id); diff --git a/gs/base/gdevpdfg.c b/gs/base/gdevpdfg.c index 7fa002808..837a792b4 100644 --- a/gs/base/gdevpdfg.c +++ b/gs/base/gdevpdfg.c @@ -935,7 +935,7 @@ pdf_write_spot_halftone(gx_device_pdf *pdev, const gs_spot_halftone *psht, if (code < 0) return code; } - *pid = pdf_begin_separate(pdev); + *pid = pdf_begin_separate(pdev, resourceHalftone); s = pdev->strm; /* Use the original, requested frequency and angle. */ pprintg2(s, "<</Type/Halftone/HalftoneType 1/Frequency %g/Angle %g", @@ -948,7 +948,7 @@ pdf_write_spot_halftone(gx_device_pdf *pdev, const gs_spot_halftone *psht, if (psht->accurate_screens) stream_puts(s, "/AccurateScreens true"); stream_puts(s, ">>\n"); - return pdf_end_separate(pdev); + return pdf_end_separate(pdev, resourceHalftone); } static int pdf_write_screen_halftone(gx_device_pdf *pdev, const gs_screen_halftone *psht, @@ -978,7 +978,7 @@ pdf_write_colorscreen_halftone(gx_device_pdf *pdev, if (code < 0) return code; } - *pid = pdf_begin_separate(pdev); + *pid = pdf_begin_separate(pdev, resourceHalftone); s = pdev->strm; /* Use Black, Gray as the Default unless we are in RGB colormodel */ /* (num_comp < 4) in which case we use Green (arbitrarily) */ @@ -990,7 +990,7 @@ pdf_write_colorscreen_halftone(gx_device_pdf *pdev, if (pdht->num_comp > 3) pprintld2(s, "/Gray %ld 0 R/Black %ld 0 R", ht_ids[3], ht_ids[3]); stream_puts(s, ">>\n"); - return pdf_end_separate(pdev); + return pdf_end_separate(pdev, resourceHalftone); } #define CHECK(expr)\ @@ -1144,7 +1144,7 @@ pdf_write_multiple_halftone(gx_device_pdf *pdev, return code; } } - *pid = pdf_begin_separate(pdev); + *pid = pdf_begin_separate(pdev, resourceHalftone); s = pdev->strm; stream_puts(s, "<</Type/Halftone/HalftoneType 5\n"); done_Default = false; @@ -1184,7 +1184,7 @@ pdf_write_multiple_halftone(gx_device_pdf *pdev, } stream_puts(s, ">>\n"); gs_free_object(mem, ids, "pdf_write_multiple_halftone"); - return pdf_end_separate(pdev); + return pdf_end_separate(pdev, resourceHalftone); } /* diff --git a/gs/base/gdevpdfk.c b/gs/base/gdevpdfk.c index 411438e55..01bf3c1ad 100644 --- a/gs/base/gdevpdfk.c +++ b/gs/base/gdevpdfk.c @@ -351,7 +351,7 @@ pdf_finish_iccbased(cos_stream_t *pcstrm) gx_device_pdf *pdev = pcstrm->pdev; pcstrm->id = pdf_obj_ref(pdev); - return cos_write_object(COS_OBJECT(pcstrm), pdev); + return cos_write_object(COS_OBJECT(pcstrm), pdev, resourceICC); } /* diff --git a/gs/base/gdevpdfm.c b/gs/base/gdevpdfm.c index 9c62d75eb..f335a7f67 100644 --- a/gs/base/gdevpdfm.c +++ b/gs/base/gdevpdfm.c @@ -357,7 +357,7 @@ pdfmark_bind_named_object(gx_device_pdf *pdev, const gs_const_string *objname, } else if (!v->contents.object->written) { /* We can't know whether the old object was referred or not. Write it out for a consistent result in any case. */ - code = cos_write_object(v->contents.object, pdev); + code = cos_write_object(v->contents.object, pdev, resourceOther); if (code < 0) return code; @@ -787,7 +787,7 @@ pdfmark_annot(gx_device_pdf * pdev, gs_param_string * pairs, uint count, } if (!objname) { /* Write the annotation now. */ - COS_WRITE_OBJECT(pcd, pdev); + COS_WRITE_OBJECT(pcd, pdev, resourceAnnotation); COS_RELEASE(pcd, "pdfmark_annot"); } return cos_array_add(annots, @@ -818,7 +818,7 @@ pdfmark_write_outline(gx_device_pdf * pdev, pdf_outline_node_t * pnode, stream *s; int code = 0; - pdf_open_separate(pdev, pnode->id); + pdf_open_separate(pdev, pnode->id, resourceOutline); if (pnode->action != NULL) pnode->action->id = pnode->id; else { @@ -842,7 +842,7 @@ pdfmark_write_outline(gx_device_pdf * pdev, pdf_outline_node_t * pnode, pprintld2(s, "/First %ld 0 R /Last %ld 0 R\n", pnode->first_id, pnode->last_id); stream_puts(s, ">>\n"); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceOutline); if (pnode->action != NULL) COS_FREE(pnode->action, "pdfmark_write_outline"); pnode->action = 0; @@ -970,7 +970,7 @@ pdfmark_write_bead(gx_device_pdf * pdev, const pdf_bead_t * pbead) stream *s; char rstr[MAX_RECT_STRING]; - pdf_open_separate(pdev, pbead->id); + pdf_open_separate(pdev, pbead->id, resourceArticle); s = pdev->strm; pprintld3(s, "<</T %ld 0 R/V %ld 0 R/N %ld 0 R", pbead->article_id, pbead->prev_id, pbead->next_id); @@ -978,7 +978,7 @@ pdfmark_write_bead(gx_device_pdf * pdev, const pdf_bead_t * pbead) pprintld1(s, "/P %ld 0 R", pbead->page_id); pdfmark_make_rect(rstr, &pbead->rect); pprints1(s, "/R%s>>\n", rstr); - return pdf_end_separate(pdev); + return pdf_end_separate(pdev, resourceArticle); } /* Finish writing an article, and release its data. */ @@ -999,12 +999,12 @@ pdfmark_write_article(gx_device_pdf * pdev, const pdf_article_t * part) pdfmark_write_bead(pdev, &art.last); } pdfmark_write_bead(pdev, &art.first); - pdf_open_separate(pdev, art.contents->id); + pdf_open_separate(pdev, art.contents->id, resourceArticle); s = pdev->strm; pprintld1(s, "<</F %ld 0 R/I<<", art.first.id); cos_dict_elements_write(art.contents, pdev); stream_puts(s, ">> >>\n"); - return pdf_end_separate(pdev); + return pdf_end_separate(pdev, resourceArticle); } /* ARTICLE pdfmark */ @@ -1263,7 +1263,7 @@ pdfmark_PS(gx_device_pdf * pdev, gs_param_string * pairs, uint count, code = pdf_exit_substream(pdev); if (code < 0) return code; - code = cos_write_object(pres->object, pdev); + code = cos_write_object(pres->object, pdev, resourceOther); if (code < 0) return code; level1_id = pres->object->id; diff --git a/gs/base/gdevpdfo.c b/gs/base/gdevpdfo.c index ca0b85f89..eaa0e9a56 100644 --- a/gs/base/gdevpdfo.c +++ b/gs/base/gdevpdfo.c @@ -219,15 +219,15 @@ cos_write(const cos_object_t *pco, gx_device_pdf *pdev, gs_id object_id) /* Write a cos object as a PDF object. */ int -cos_write_object(cos_object_t *pco, gx_device_pdf *pdev) +cos_write_object(cos_object_t *pco, gx_device_pdf *pdev, pdf_resource_type_t type) { int code; if (pco->id == 0 || pco->written) return_error(gs_error_Fatal); - pdf_open_separate(pdev, pco->id); + pdf_open_separate(pdev, pco->id, type); code = cos_write(pco, pdev, pco->id); - pdf_end_separate(pdev); + pdf_end_separate(pdev, type); pco->written = true; return code; } @@ -871,7 +871,7 @@ cos_dict_objects_write(const cos_dict_t *pcd, gx_device_pdf *pdev) if (COS_VALUE_IS_OBJECT(&pcde->value) && pcde->value.contents.object->id && !pcde->value.contents.object->written /* ForOPDFRead only. */) - cos_write_object(pcde->value.contents.object, pdev); + cos_write_object(pcde->value.contents.object, pdev, resourceOther); return 0; } int diff --git a/gs/base/gdevpdfo.h b/gs/base/gdevpdfo.h index 362f96455..8baaca921 100644 --- a/gs/base/gdevpdfo.h +++ b/gs/base/gdevpdfo.h @@ -323,8 +323,8 @@ int cos_dict_objects_write(const cos_dict_t *, gx_device_pdf *); int cos_dict_objects_delete(cos_dict_t *); /* Write a cos object as a PDF object. */ -int cos_write_object(cos_object_t *pco, gx_device_pdf *pdev); -#define COS_WRITE_OBJECT(pc, pdev) cos_write_object(COS_OBJECT(pc), pdev) +int cos_write_object(cos_object_t *pco, gx_device_pdf *pdev, pdf_resource_type_t type); +#define COS_WRITE_OBJECT(pc, pdev, type) cos_write_object(COS_OBJECT(pc), pdev, type) /* Free a Cos value owned by a Cos object. */ void cos_value_free(const cos_value_t *, const cos_object_t *, client_name_t); diff --git a/gs/base/gdevpdfu.c b/gs/base/gdevpdfu.c index 416acb80d..48a078335 100644 --- a/gs/base/gdevpdfu.c +++ b/gs/base/gdevpdfu.c @@ -434,9 +434,6 @@ pdf_open_document(gx_device_pdf * pdev) stream_puts(s, "/FitPages true def\n"); if(pdev->CenterPages) stream_puts(s, "/CenterPages true def\n"); - } else { - sprintf(BBox, "%%%%EndProlog\n"); - stream_write(s, (byte *)BBox, strlen(BBox)); } pdev->OPDFRead_procset_length = stell(s); } @@ -525,7 +522,7 @@ pdf_obj_ref(gx_device_pdf * pdev) /* Begin an object, optionally allocating an ID. */ long -pdf_open_obj(gx_device_pdf * pdev, long id) +pdf_open_obj(gx_device_pdf * pdev, long id, pdf_resource_type_t type) { stream *s = pdev->strm; @@ -541,20 +538,144 @@ pdf_open_obj(gx_device_pdf * pdev, long id) fwrite(&pos, sizeof(pos), 1, tfile); fseek(tfile, tpos, SEEK_SET); } + if (pdev->ForOPDFRead && pdev->ProduceDSC) { + switch(type) { + case resourceNone: + /* Used when outputting usage of a previously defined resource + * Does not want comments around its use + */ + break; + case resourcePage: + /* We *don't* want resource comments around pages */ + break; + case resourceColorSpace: + pprintld1(s, "%%%%BeginResource: file (PDF Color Space obj_%ld)\n", id); + break; + case resourceExtGState: + pprintld1(s, "%%%%BeginResource: file (PDF Extended Graphics State obj_%ld)\n", id); + break; + case resourcePattern: + pprintld1(s, "%%%%BeginResource: pattern (PDF Pattern obj_%ld)\n", id); + break; + case resourceShading: + pprintld1(s, "%%%%BeginResource: file (PDF Shading obj_%ld)\n", id); + break; + case resourceCIDFont: + case resourceFont: + /* Ought to write the font name here */ + pprintld1(s, "%%%%BeginResource: font (PDF Font obj_%ld)\n", id); + break; + case resourceCharProc: + pprintld1(s, "%%%%BeginResource: file (PDF CharProc obj_%ld)\n", id); + break; + case resourceCMap: + pprintld1(s, "%%%%BeginResource: file (PDF CMap obj_%ld)\n", id); + break; + case resourceFontDescriptor: + pprintld1(s, "%%%%BeginResource: file (PDF FontDescriptor obj_%ld)\n", id); + break; + case resourceGroup: + pprintld1(s, "%%%%BeginResource: file (PDF Group obj_%ld)\n", id); + break; + case resourceFunction: + pprintld1(s, "%%%%BeginResource: file (PDF Function obj_%ld)\n", id); + break; + case resourceEncoding: + pprintld1(s, "%%%%BeginResource: encoding (PDF Encoding obj_%ld)\n", id); + break; + case resourceCIDSystemInfo: + pprintld1(s, "%%%%BeginResource: file (PDF CIDSystemInfo obj_%ld)\n", id); + break; + case resourceHalftone: + pprintld1(s, "%%%%BeginResource: file (PDF Halftone obj_%ld)\n", id); + break; + case resourceLength: + pprintld1(s, "%%%%BeginResource: file (PDF Length obj_%ld)\n", id); + break; + case resourceSoftMaskDict: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF SoftMask obj_%ld)\n", id); + break; + case resourceXObject: + /* This should not be possible, we write these inline */ + pprintld1(s, "%%%%BeginResource: file (PDF XObject obj_%ld)\n", id); + break; + case resourceStream: + /* Possibly we should not add comments to this type */ + pprintld1(s, "%%%%BeginResource: file (PDF stream obj_%ld)\n", id); + break; + case resourceOutline: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Outline obj_%ld)\n", id); + break; + case resourceArticle: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Article obj_%ld)\n", id); + break; + case resourceDests: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Dests obj_%ld)\n", id); + break; + case resourceLabels: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Page Labels obj_%ld)\n", id); + break; + case resourceThread: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Thread obj_%ld)\n", id); + break; + case resourceCatalog: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Catalog obj_%ld)\n", id); + break; + case resourceEncrypt: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Encryption obj_%ld)\n", id); + break; + case resourcePagesTree: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Pages Tree obj_%ld)\n", id); + break; + case resourceMetadata: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Metadata obj_%ld)\n", id); + break; + case resourceICC: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF ICC Profile obj_%ld)\n", id); + break; + case resourceAnnotation: + /* This should not be possible, not valid in PostScript */ + pprintld1(s, "%%%%BeginResource: file (PDF Annotation obj_%ld)\n", id); + break; + default: + pprintld1(s, "%%%%BeginResource: file (PDF object obj_%ld)\n", id); + break; + } + } pprintld1(s, "%ld 0 obj\n", id); return id; } long -pdf_begin_obj(gx_device_pdf * pdev) +pdf_begin_obj(gx_device_pdf * pdev, pdf_resource_type_t type) { - return pdf_open_obj(pdev, 0L); + return pdf_open_obj(pdev, 0L, type); } /* End an object. */ int -pdf_end_obj(gx_device_pdf * pdev) +pdf_end_obj(gx_device_pdf * pdev, pdf_resource_type_t type) { stream_puts(pdev->strm, "endobj\n"); + if (pdev->ForOPDFRead && pdev->ProduceDSC) { + switch(type) { + case resourcePage: + break; + default: + stream_puts(pdev->strm, "%%EndResource\n"); + break; + } + } return 0; } @@ -670,7 +791,7 @@ none_to_stream(gx_device_pdf * pdev) pdev->contents_pos = -1; /* inapplicable */ s = pdev->strm; } else { - pdev->contents_id = pdf_begin_obj(pdev); + pdev->contents_id = pdf_begin_obj(pdev, resourceStream); pdev->contents_length_id = pdf_obj_ref(pdev); s = pdev->strm; pprintld1(s, "<</Length %ld 0 R", pdev->contents_length_id); @@ -834,10 +955,10 @@ stream_to_none(gx_device_pdf * pdev) if (pdev->PDFA) stream_puts(s, "\n"); stream_puts(s, "endstream\n"); - pdf_end_obj(pdev); - pdf_open_obj(pdev, pdev->contents_length_id); + pdf_end_obj(pdev, resourceStream); + pdf_open_obj(pdev, pdev->contents_length_id, resourceLength); pprintld1(s, "%ld\n", length); - pdf_end_obj(pdev); + pdf_end_obj(pdev, resourceLength); } return PDF_IN_NONE; } @@ -893,8 +1014,8 @@ pdf_cancel_resource(gx_device_pdf * pdev, pdf_resource_t *pres, pdf_resource_typ /* fixme : remove *pres from resource chain. */ pres->where_used = 0; pres->object->written = true; - if (rtype == resourceXObject || rtype == resourceCharProc || rtype == resourceOther - ) { + if (rtype == resourceXObject || rtype == resourceCharProc || rtype == resourceOther + || rtype > NUM_RESOURCE_TYPES) { int code = cos_stream_release_pieces((cos_stream_t *)pres->object); if (code < 0) @@ -960,7 +1081,7 @@ pdf_substitute_resource(gx_device_pdf *pdev, pdf_resource_t **ppres, } else { pdf_reserve_object_id(pdev, pres1, gs_no_id); if (write) { - code = cos_write_object(pres1->object, pdev); + code = cos_write_object(pres1->object, pdev, rtype); if (code < 0) return code; pres1->object->written = 1; @@ -1099,7 +1220,7 @@ pdf_print_resource_statistics(gx_device_pdf * pdev) /* Begin an object logically separate from the contents. */ long -pdf_open_separate(gx_device_pdf * pdev, long id) +pdf_open_separate(gx_device_pdf * pdev, long id, pdf_resource_type_t type) { int code; code = pdf_open_document(pdev); @@ -1107,12 +1228,12 @@ pdf_open_separate(gx_device_pdf * pdev, long id) return code; pdev->asides.save_strm = pdev->strm; pdev->strm = pdev->asides.strm; - return pdf_open_obj(pdev, id); + return pdf_open_obj(pdev, id, type); } long -pdf_begin_separate(gx_device_pdf * pdev) +pdf_begin_separate(gx_device_pdf * pdev, pdf_resource_type_t type) { - return pdf_open_separate(pdev, 0L); + return pdf_open_separate(pdev, 0L, type); } void @@ -1160,9 +1281,10 @@ pdf_alloc_aside(gx_device_pdf * pdev, pdf_resource_t ** plist, } int pdf_begin_aside(gx_device_pdf * pdev, pdf_resource_t ** plist, - const gs_memory_struct_type_t * pst, pdf_resource_t ** ppres) + const gs_memory_struct_type_t * pst, pdf_resource_t ** ppres, + pdf_resource_type_t type) { - long id = pdf_begin_separate(pdev); + long id = pdf_begin_separate(pdev, type); if (id < 0) return (int)id; @@ -1174,8 +1296,13 @@ int pdf_begin_resource_body(gx_device_pdf * pdev, pdf_resource_type_t rtype, gs_id rid, pdf_resource_t ** ppres) { - int code = pdf_begin_aside(pdev, PDF_RESOURCE_CHAIN(pdev, rtype, rid), - pdf_resource_type_structs[rtype], ppres); + int code; + + if (rtype > NUM_RESOURCE_TYPES) + rtype = resourceOther; + + code = pdf_begin_aside(pdev, PDF_RESOURCE_CHAIN(pdev, rtype, rid), + pdf_resource_type_structs[rtype], ppres, rtype); if (code >= 0) (*ppres)->rid = rid; @@ -1185,7 +1312,12 @@ int pdf_begin_resource(gx_device_pdf * pdev, pdf_resource_type_t rtype, gs_id rid, pdf_resource_t ** ppres) { - int code = pdf_begin_resource_body(pdev, rtype, rid, ppres); + int code; + + if (rtype > NUM_RESOURCE_TYPES) + rtype = resourceOther; + + code = pdf_begin_resource_body(pdev, rtype, rid, ppres); if (code >= 0 && pdf_resource_type_names[rtype] != 0) { stream *s = pdev->strm; @@ -1201,7 +1333,12 @@ int pdf_alloc_resource(gx_device_pdf * pdev, pdf_resource_type_t rtype, gs_id rid, pdf_resource_t ** ppres, long id) { - int code = pdf_alloc_aside(pdev, PDF_RESOURCE_CHAIN(pdev, rtype, rid), + int code; + + if (rtype > NUM_RESOURCE_TYPES) + rtype = resourceOther; + + code = pdf_alloc_aside(pdev, PDF_RESOURCE_CHAIN(pdev, rtype, rid), pdf_resource_type_structs[rtype], ppres, id); if (code >= 0) @@ -1218,46 +1355,28 @@ pdf_resource_id(const pdf_resource_t *pres) /* End an aside or other separate object. */ int -pdf_end_separate(gx_device_pdf * pdev) +pdf_end_separate(gx_device_pdf * pdev, pdf_resource_type_t type) { - int code = pdf_end_obj(pdev); + int code = pdf_end_obj(pdev, type); pdev->strm = pdev->asides.save_strm; pdev->asides.save_strm = 0; return code; } int -pdf_end_aside(gx_device_pdf * pdev) +pdf_end_aside(gx_device_pdf * pdev, pdf_resource_type_t type) { - return pdf_end_separate(pdev); + return pdf_end_separate(pdev, type); } /* End a resource. */ int -pdf_end_resource(gx_device_pdf * pdev) +pdf_end_resource(gx_device_pdf * pdev, pdf_resource_type_t type) { - return pdf_end_aside(pdev); + return pdf_end_aside(pdev, type); } -int -opdfread_pdf_write_resource_objects(gx_device_pdf *pdev, pdf_resource_type_t rtype) -{ - int j, code = 0; - - for (j = 0; j < NUM_RESOURCE_CHAINS && code >= 0; ++j) { - pdf_resource_t *pres = pdev->resources[rtype].chains[j]; - - for (; pres != 0; pres = pres->next) - if ((!pres->named || pdev->ForOPDFRead) - && !pres->object->written) { - stream_puts(pdev->strm, "%%BeginResource:"); - code = cos_write_object(pres->object, pdev); - stream_puts(pdev->strm, "%%EndResource"); - } - } - return code; -} /* * Write the Cos objects for resources local to a content stream. Formerly, * this procedure also freed such objects, but this doesn't work, because @@ -1274,7 +1393,7 @@ pdf_write_resource_objects(gx_device_pdf *pdev, pdf_resource_type_t rtype) for (; pres != 0; pres = pres->next) if ((!pres->named || pdev->ForOPDFRead) && !pres->object->written) { - code = cos_write_object(pres->object, pdev); + code = cos_write_object(pres->object, pdev, rtype); } } return code; @@ -1372,7 +1491,7 @@ pdf_store_page_resources(gx_device_pdf *pdev, pdf_page_t *page, bool clear_usage stream *s = 0; int j; - if (i == resourceOther) + if (i == resourceOther || i > NUM_RESOURCE_TYPES) continue; page->resource_ids[i] = 0; for (j = 0; j < NUM_RESOURCE_CHAINS; ++j) { @@ -1385,7 +1504,7 @@ pdf_store_page_resources(gx_device_pdf *pdev, pdf_page_t *page, bool clear_usage if (id == -1L) continue; if (s == 0) { - page->resource_ids[i] = pdf_begin_separate(pdev); + page->resource_ids[i] = pdf_begin_separate(pdev, i); s = pdev->strm; stream_puts(s, "<<"); } @@ -1398,7 +1517,7 @@ pdf_store_page_resources(gx_device_pdf *pdev, pdf_page_t *page, bool clear_usage } if (s) { stream_puts(s, ">>\n"); - pdf_end_separate(pdev); + pdf_end_separate(pdev, i); if (i != resourceFont) pdf_write_resource_objects(pdev, i); } @@ -2006,7 +2125,7 @@ pdf_begin_data_stream(gx_device_pdf *pdev, pdf_data_writer_t *pdw, pdw->binary.target = pdev->strm; pdw->binary.dev = (gx_device_psdf *)pdev; pdw->binary.strm = 0; /* for GC in case of failure */ - code = pdf_open_aside(pdev, resourceOther, gs_no_id, &pdw->pres, !object_id, + code = pdf_open_aside(pdev, resourceNone, gs_no_id, &pdw->pres, !object_id, options); if (object_id != 0) pdf_reserve_object_id(pdev, pdw->pres, object_id); @@ -2022,7 +2141,7 @@ pdf_end_data(pdf_data_writer_t *pdw) code = pdf_close_aside(pdw->pdev); if (code < 0) return code; - code = COS_WRITE_OBJECT(pdw->pres->object, pdw->pdev); + code = COS_WRITE_OBJECT(pdw->pres->object, pdw->pdev, resourceNone); if (code < 0) return code; return 0; diff --git a/gs/base/gdevpdfx.h b/gs/base/gdevpdfx.h index b93683ec0..c77b0c6ad 100644 --- a/gs/base/gdevpdfx.h +++ b/gs/base/gdevpdfx.h @@ -99,7 +99,10 @@ typedef enum { resourcePattern, resourceShading, resourceXObject, - resourceOther, /* Anything else that needs to be stored for a time. */ + resourceOther, /* Anything else that needs to be stored for a time. + * Can be any of the types defined below NUM_RESOURCE_TYPES + * but this is the type used to identify the object. + */ resourceFont, /* * Internally used (pseudo-)resources. @@ -112,12 +115,37 @@ typedef enum { resourceSoftMaskDict, resourceFunction, resourcePage, - NUM_RESOURCE_TYPES + NUM_RESOURCE_TYPES, + /* These resource types were 'resourceOther', but we want to track them + * for ps2write. They are not stored in the pdf device structure, unlike + * the reource types above. + */ + resourceEncoding, + resourceCIDSystemInfo, + resourceHalftone, + resourceLength, + resourceStream, + resourceOutline, + resourceArticle, + resourceDests, + resourceLabels, + resourceThread, + resourceCatalog, + resourceEncrypt, + resourcePagesTree, + resourceMetadata, + resourceICC, + resourceAnnotation, + resourceNone /* Special, used when this isn't a resource at all + * eg when we execute a resource we've just written, such as + * a Pattern. + */ } pdf_resource_type_t; #define PDF_RESOURCE_TYPE_NAMES\ "/ColorSpace", "/ExtGState", "/Pattern", "/Shading", "/XObject", 0, "/Font",\ - 0, "/Font", "/CMap", "/FontDescriptor", "/Group", "/Mask", 0, 0 + 0, "/Font", "/CMap", "/FontDescriptor", "/Group", "/Mask", 0, 0, 0, 0, 0,\ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 #define PDF_RESOURCE_TYPE_STRUCTS\ &st_pdf_color_space, /* gdevpdfg.h / gdevpdfc.c */\ &st_pdf_resource, /* see below */\ @@ -778,11 +806,11 @@ long pdf_obj_ref(gx_device_pdf * pdev); long pdf_stell(gx_device_pdf * pdev); /* Begin an object, optionally allocating an ID. */ -long pdf_open_obj(gx_device_pdf * pdev, long id); -long pdf_begin_obj(gx_device_pdf * pdev); +long pdf_open_obj(gx_device_pdf * pdev, long id, pdf_resource_type_t type); +long pdf_begin_obj(gx_device_pdf * pdev, pdf_resource_type_t type); /* End an object. */ -int pdf_end_obj(gx_device_pdf * pdev); +int pdf_end_obj(gx_device_pdf * pdev, pdf_resource_type_t type); /* ------ Page contents ------ */ @@ -807,8 +835,8 @@ extern const gs_memory_struct_type_t *const pdf_resource_type_structs[]; /* Begin an object logically separate from the contents. */ /* (I.e., an object in the resource file.) */ -long pdf_open_separate(gx_device_pdf * pdev, long id); -long pdf_begin_separate(gx_device_pdf * pdev); +long pdf_open_separate(gx_device_pdf * pdev, long id, pdf_resource_type_t type); +long pdf_begin_separate(gx_device_pdf * pdev, pdf_resource_type_t type); /* Reserve object id. */ void pdf_reserve_object_id(gx_device_pdf * pdev, pdf_resource_t *ppres, long id); @@ -820,7 +848,7 @@ int pdf_alloc_aside(gx_device_pdf * pdev, pdf_resource_t ** plist, /* Begin an aside (resource, annotation, ...). */ int pdf_begin_aside(gx_device_pdf * pdev, pdf_resource_t **plist, const gs_memory_struct_type_t * pst, - pdf_resource_t **ppres); + pdf_resource_t **ppres, pdf_resource_type_t type); /* Begin a resource of a given type. */ int pdf_begin_resource(gx_device_pdf * pdev, pdf_resource_type_t rtype, @@ -874,13 +902,13 @@ int pdf_substitute_resource(gx_device_pdf *pdev, pdf_resource_t **ppres, long pdf_resource_id(const pdf_resource_t *pres); /* End a separate object. */ -int pdf_end_separate(gx_device_pdf * pdev); +int pdf_end_separate(gx_device_pdf * pdev, pdf_resource_type_t type); /* End an aside. */ -int pdf_end_aside(gx_device_pdf * pdev); +int pdf_end_aside(gx_device_pdf * pdev, pdf_resource_type_t type); /* End a resource. */ -int pdf_end_resource(gx_device_pdf * pdev); +int pdf_end_resource(gx_device_pdf * pdev, pdf_resource_type_t type); /* * Write the Cos objects for resources local to a content stream. diff --git a/gs/base/gdevpdtd.c b/gs/base/gdevpdtd.c index 44137c850..8db1446f0 100644 --- a/gs/base/gdevpdtd.c +++ b/gs/base/gdevpdtd.c @@ -163,7 +163,7 @@ write_FontDescriptor_common(gx_device_pdf *pdev, printer_param_list_t rlist; gs_param_list *const plist = (gs_param_list *)&rlist; - pdf_open_separate(pdev, pdf_font_descriptor_common_id(pfd)); + pdf_open_separate(pdev, pdf_font_descriptor_common_id(pfd), resourceFontDescriptor); s = pdev->strm; stream_puts(s, "<</Type/FontDescriptor/FontName"); pdf_put_name(pdev, pfd->values.FontName.data, pfd->values.FontName.size); @@ -676,11 +676,11 @@ pdf_write_FontDescriptor(gx_device_pdf *pdev, pdf_resource_t *pres) COS_WRITE(pfd->cid.FD, pdev); } stream_puts(s, ">>\n"); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceFontDescriptor); pfd->common.object->written = true; { const cos_object_t *pco = (const cos_object_t *)pdf_get_FontFile_object(pfd->base_font); if (pco != NULL) { - code = COS_WRITE_OBJECT(pco, pdev); + code = COS_WRITE_OBJECT(pco, pdev, resourceNone); if (code < 0) return code; } diff --git a/gs/base/gdevpdti.c b/gs/base/gdevpdti.c index db160246e..5c0dd65c0 100644 --- a/gs/base/gdevpdti.c +++ b/gs/base/gdevpdti.c @@ -453,7 +453,7 @@ pdf_end_char_proc(gx_device_pdf * pdev, pdf_stream_position_t * ppos) if (pdev->PDFA) stream_puts(s, "\n"); stream_puts(s, "endstream\n"); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceCharProc); return 0; } @@ -516,7 +516,7 @@ pdf_write_bitmap_fonts_Encoding(gx_device_pdf *pdev) stream *s; int i; - pdf_open_separate(pdev, pbfs->bitmap_encoding_id); + pdf_open_separate(pdev, pbfs->bitmap_encoding_id, resourceEncoding); s = pdev->strm; /* * Even though the PDF reference documentation says that a @@ -532,7 +532,7 @@ pdf_write_bitmap_fonts_Encoding(gx_device_pdf *pdev) pprintd1(s, "/a%d", i); } stream_puts(s, "\n] >>\n"); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceEncoding); pbfs->bitmap_encoding_id = 0; } return 0; @@ -620,6 +620,9 @@ pdf_open_aside(gx_device_pdf *pdev, pdf_resource_type_t rtype, }; pdev->streams.save_strm = pdev->strm; + + if (rtype > NUM_RESOURCE_TYPES) + rtype = resourceOther; code = pdf_alloc_aside(pdev, PDF_RESOURCE_CHAIN(pdev, rtype, id), pdf_resource_type_structs[rtype], &pres, reserve_object_id ? 0 : -1); if (code < 0) diff --git a/gs/base/gdevpdtw.c b/gs/base/gdevpdtw.c index f3fb619bd..dbefebb69 100644 --- a/gs/base/gdevpdtw.c +++ b/gs/base/gdevpdtw.c @@ -141,7 +141,7 @@ pdf_write_encoding(gx_device_pdf *pdev, const pdf_font_resource_t *pdfont, long const int sl = strlen(gx_extendeg_glyph_name_separator); int prev = 256, code, cnt = 0; - pdf_open_separate(pdev, id); + pdf_open_separate(pdev, id, resourceEncoding); s = pdev->strm; stream_puts(s, "<</Type/Encoding"); if (base_encoding < 0 && pdev->ForOPDFRead) @@ -183,7 +183,7 @@ pdf_write_encoding(gx_device_pdf *pdev, const pdf_font_resource_t *pdfont, long } } stream_puts(s, "]>>\n"); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceEncoding); return 0; } @@ -222,7 +222,7 @@ pdf_write_simple_contents(gx_device_pdf *pdev, pprints1(s, "/Subtype/%s>>\n", (pdfont->FontType == ft_TrueType ? "TrueType" : pdfont->u.simple.s.type1.is_MM_instance ? "MMType1" : "Type1")); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceFont); if (diff_id) { mark_font_descriptor_symbolic(pdfont); code = pdf_write_encoding(pdev, pdfont, diff_id, ch); @@ -415,7 +415,7 @@ pdf_write_contents_type0(gx_device_pdf *pdev, pdf_font_resource_t *pdfont) pprintld1(s, "/DescendantFonts[%ld 0 R]", pdf_font_id(pdfont->u.type0.DescendantFont)); stream_puts(s, "/Subtype/Type0>>\n"); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceFont); return 0; } @@ -433,7 +433,7 @@ pdf_finish_write_contents_type3(gx_device_pdf *pdev, pdf_write_Widths(pdev, pdfont->u.simple.FirstChar, pdfont->u.simple.LastChar, pdfont->Widths); stream_puts(s, "/Subtype/Type3>>\n"); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceFont); return 0; } @@ -480,7 +480,7 @@ write_contents_cid_common(gx_device_pdf *pdev, pdf_font_resource_t *pdfont, pprintld1(s, "/CIDSystemInfo %ld 0 R", pdfont->u.cidfont.CIDSystemInfo_id); pprintd1(s, "/Subtype/CIDFontType%d>>\n", subtype); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceFont); return 0; } int @@ -571,13 +571,13 @@ pdf_write_font_resource(gx_device_pdf *pdev, pdf_font_resource_t *pdfont) pcd_Resources = pdfont->u.simple.s.type3.Resources; pcd_Resources->id = pdf_obj_ref(pdev); - pdf_open_separate(pdev, pcd_Resources->id); + pdf_open_separate(pdev, pcd_Resources->id, resourceFont); code = COS_WRITE(pcd_Resources, pdev); if (code < 0) return code; - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceFont); } - pdf_open_separate(pdev, pdf_font_id(pdfont)); + pdf_open_separate(pdev, pdf_font_id(pdfont), resourceFont); s = pdev->strm; stream_puts(s, "<<"); if (pdfont->BaseFont.size > 0) { @@ -724,9 +724,9 @@ pdf_write_cid_systemInfo_separate(gx_device_pdf *pdev, const gs_cid_system_info_ { int code; - *id = pdf_begin_separate(pdev); + *id = pdf_begin_separate(pdev, resourceCIDSystemInfo); code = pdf_write_cid_system_info(pdev, pcidsi, *id); - pdf_end_separate(pdev); + pdf_end_separate(pdev, resourceCIDSystemInfo); return code; } |