diff options
-rw-r--r-- | Resource/Init/pdf_main.ps | 49 | ||||
-rw-r--r-- | pdf/ghostpdf.c | 2 | ||||
-rw-r--r-- | pdf/ghostpdf.h | 2 | ||||
-rw-r--r-- | pdf/pdf_doc.c | 33 | ||||
-rw-r--r-- | pdf/pdftop.c | 10 | ||||
-rw-r--r-- | psi/zpdfops.c | 565 |
6 files changed, 384 insertions, 277 deletions
diff --git a/Resource/Init/pdf_main.ps b/Resource/Init/pdf_main.ps index ec0865473..4c8ecfbbd 100644 --- a/Resource/Init/pdf_main.ps +++ b/Resource/Init/pdf_main.ps @@ -824,7 +824,8 @@ systemdict /OLDPDF known not {/OLDPDF //false def} if /PDFNOCIDFALLBACK /NO_PDFMARK_OUTLINES /NO_PDFMARK_DESTS /PDFFitPage /Printed /UsePDFX3Profile /UseBleedBox /UseCropBox /UseArtBox /UseTrimBox /ShowAcroForm /ShowAnnots /PreserveAnnots /NoUserUnit /RENDERTTNOTDEF /DOPDFMARKS /PDFINFO /ShowAnnotTypes /PreserveAnnotTypes - /CIDFSubstPath /CIDFSubstFont /SUBSTFONT /IgnoreToUnicode /NONATIVEFONTMAP /PreserveMarkedContent /OutputFile] def + /CIDFSubstPath /CIDFSubstFont /SUBSTFONT /IgnoreToUnicode /NONATIVEFONTMAP /PreserveMarkedContent /OutputFile + /PreserveDocView /PreserveEmbeddedFiles ] def /newpdf_gather_parameters { @@ -923,6 +924,33 @@ currentdict /PDFSwitches undef } ifelse } bind def + +/runpdf_collection_entry +{ + <</PreserveDocView false>> runpdfbegin_with_params % <file> runpdfbegin - + PDFInfo type /dicttype eq + { + PDFInfo /Collection known + { + PDFInfo /Collection get + pdfclose + dup length 1 sub 0 2 3 -1 roll + { + 1 index exch get (r) file runpdf_collection_entry + } for + pop + } + { + process_trailer_attrs % - process_trailer_attrs - + runpdfpagerange % - runpdfpagerange <int> <int> + dopdfpages % <int> <int> dopdfpages - + runpdfend % - runpdfend - + } ifelse + } { + pop pop + }ifelse +} bind def + % <file> runpdf - /newpdf_runpdf { @@ -935,7 +963,7 @@ currentdict /PDFSwitches undef pdfclose dup length 1 sub 0 2 3 -1 roll { - 1 index exch get (r) file runpdf + 1 index exch get (r) file runpdf_collection_entry } for pop } @@ -950,7 +978,13 @@ currentdict /PDFSwitches undef }ifelse } bind def -/newpdf_runpdfbegin +% start a PDF file, and specify interpreter parameters to be used +% to override any command line ones. +% Mostly for the benefit of PDF Collections where we want to disable +%preserving DocView information for pdfwrite. +% +% file <dict> runpdfbegin_with_params - +/runpdfbegin_with_params { /pdfdict 10 dict def pdfdict begin @@ -981,7 +1015,8 @@ currentdict /PDFSwitches undef /knownoget {2 copy known {get //true}{pop pop //false}ifelse} bind def /pget {2 copy known {get //true}{pop pop //false}ifelse}bind def - newpdf_gather_parameters + newpdf_gather_parameters % <parameter overrides dict> <parameter dict> + exch {2 index 3 1 roll put} forall PDFSTOPONERROR { .PDFInit @@ -1006,6 +1041,12 @@ currentdict /PDFSwitches undef }ifelse } bind def +% -file- newpdf_runpdfbegin - +/newpdf_runpdfbegin +{ + <<>> runpdfbegin_with_params +} bind def + /newpdf_pdfgetpage { dup 1 sub diff --git a/pdf/ghostpdf.c b/pdf/ghostpdf.c index 5adac672c..6d101c7b4 100644 --- a/pdf/ghostpdf.c +++ b/pdf/ghostpdf.c @@ -1820,6 +1820,8 @@ pdf_context *pdfi_create_context(gs_memory_t *mem) /* Setup some flags that don't default to 'false' */ ctx->args.showannots = true; ctx->args.preserveannots = true; + ctx->args.preserveembeddedfiles = true; + ctx->args.preservedocview = true; /* NOTE: For testing certain annotations on cluster, might want to set this to false */ ctx->args.printed = false; /* True if OutputFile is set, false otherwise see pdftop.c, pdf_impl_set_param() */ diff --git a/pdf/ghostpdf.h b/pdf/ghostpdf.h index acf6b0d72..8c91ebcf6 100644 --- a/pdf/ghostpdf.h +++ b/pdf/ghostpdf.h @@ -137,6 +137,8 @@ typedef struct cmd_args_s { bool preserveannots; char **preserveannottypes; /* Null terminated array of strings, NULL if none */ bool preservemarkedcontent; + bool preserveembeddedfiles; + bool preservedocview; bool nouserunit; bool renderttnotdef; bool pdfinfo; diff --git a/pdf/pdf_doc.c b/pdf/pdf_doc.c index ca32e55aa..272703dfa 100644 --- a/pdf/pdf_doc.c +++ b/pdf/pdf_doc.c @@ -1602,6 +1602,13 @@ static int pdfi_doc_EmbeddedFiles(pdf_context *ctx) pdf_array *Names_array = NULL; pdf_array *Kids = NULL; + code = pdfi_dict_knownget_type(ctx, ctx->Root, "Collection", PDF_DICT, (pdf_obj **)&Names); + if (code < 0) goto exit; + if (code > 0) { + code = 0; + goto exit; + } + code = pdfi_dict_knownget_type(ctx, ctx->Root, "Names", PDF_DICT, (pdf_obj **)&Names); if (code <= 0) goto exit; @@ -1796,8 +1803,6 @@ int pdfi_doc_trailer(pdf_context *ctx) } if (ctx->device_state.writepdfmarks) { - code = pdfi_doc_view(ctx); - /* Handle Outlines */ code = pdfi_doc_Outlines(ctx); if (code < 0) { @@ -1807,11 +1812,13 @@ int pdfi_doc_trailer(pdf_context *ctx) } /* Handle Docview pdfmark stuff */ - code = pdfi_doc_view(ctx); - if (code < 0) { - pdfi_set_warning(ctx, code, NULL, W_PDF_BAD_VIEW, "pdfi_doc_view", NULL); - if (ctx->args.pdfstoponerror) - goto exit; + if (ctx->args.preservedocview) { + code = pdfi_doc_view(ctx); + if (code < 0) { + pdfi_set_warning(ctx, code, NULL, W_PDF_BAD_VIEW, "pdfi_doc_view", NULL); + if (ctx->args.pdfstoponerror) + goto exit; + } } /* Handle Info */ @@ -1828,11 +1835,13 @@ int pdfi_doc_trailer(pdf_context *ctx) /* Handle EmbeddedFiles */ /* TODO: add a configuration option to embed or omit */ - code = pdfi_doc_EmbeddedFiles(ctx); - if (code < 0) { - pdfi_set_warning(ctx, 0, NULL, W_PDF_BAD_EMBEDDEDFILES, "pdfi_doc_trailer", NULL); - if (ctx->args.pdfstoponerror) - goto exit; + if (ctx->args.preserveembeddedfiles) { + code = pdfi_doc_EmbeddedFiles(ctx); + if (code < 0) { + pdfi_set_warning(ctx, 0, NULL, W_PDF_BAD_EMBEDDEDFILES, "pdfi_doc_trailer", NULL); + if (ctx->args.pdfstoponerror) + goto exit; + } } } diff --git a/pdf/pdftop.c b/pdf/pdftop.c index d80f9198c..10ea92c43 100644 --- a/pdf/pdftop.c +++ b/pdf/pdftop.c @@ -632,6 +632,16 @@ pdf_impl_set_param(pl_interp_implementation_t *impl, if (code < 0) return code; } + if (argis(param, "PreserveEmbeddedFiles")) { + code = plist_value_get_bool(&pvalue, &ctx->args.preserveembeddedfiles); + if (code < 0) + return code; + } + if (argis(param, "PreserveDocView")) { + code = plist_value_get_bool(&pvalue, &ctx->args.preservedocview); + if (code < 0) + return code; + } if (argis(param, "NoUserUnit")) { code = plist_value_get_bool(&pvalue, &ctx->args.nouserunit); if (code < 0) diff --git a/psi/zpdfops.c b/psi/zpdfops.c index 43ab41c2b..20620334a 100644 --- a/psi/zpdfops.c +++ b/psi/zpdfops.c @@ -1232,310 +1232,352 @@ static int param_value_get_namelist(gs_memory_t *ps_mem, pdf_context *ctx, ref * return 0; } -static int zPDFInit(i_ctx_t *i_ctx_p) +static int apply_interpreter_params(i_ctx_t *i_ctx_p, pdfctx_t *pdfctx, ref *pdictref) { - os_ptr op = osp; - ref *pdictref = NULL, *pvalueref; - pdfctx_t *pdfctx = NULL; - pdf_context *ctx = NULL; - int code = 0; - gs_memory_t *cmem; - - code = gs_memory_chunk_wrap(&cmem, imemory->non_gc_memory); - if (code < 0) - return_error(gs_error_VMerror); + int code = gs_error_typecheck; + ref *pvalueref; - pdfctx = gs_alloc_struct(imemory, pdfctx_t, &st_pdfctx_t, "PDFcontext"); - if (!pdfctx) { - code = gs_note_error(gs_error_VMerror); - goto error; - } - pdfctx->pdf_memory = cmem; - pdfctx->ctx = NULL; - pdfctx->ps_stream = NULL; - pdfctx->pdf_stream = NULL; - pdfctx->UsingPDFFile = false; - pdfctx->pdf_stream_memory = NULL; - pdfctx->profile_cache = gsicc_profilecache_new(imemory); - if (pdfctx->profile_cache == NULL) { - code = gs_note_error(gs_error_VMerror); - goto error; + if (dict_find_string(pdictref, "PDFDEBUG", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.pdfdebug = pvalueref->value.boolval; } - pdfctx->cache_memory = imemory; - ctx = pdfi_create_context(cmem); - if (ctx == NULL) { - code = gs_note_error(gs_error_VMerror); - goto error; + if (dict_find_string(pdictref, "PDFSTOPONERROR", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.pdfstoponerror = pvalueref->value.boolval; } - pdfctx->ctx = ctx; - get_zfont_glyph_name(&pdfctx->ctx->get_glyph_name); - pdfctx->ctx->get_glyph_index = zpdfi_glyph_index; - - if (ref_stack_count(&o_stack) > 0 && r_has_type(op, t_dictionary)) { - pdictref = op; + if (dict_find_string(pdictref, "PDFSTOPONWARNING", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.pdfstoponwarning = pvalueref->value.boolval; + if (pvalueref->value.boolval) + pdfctx->ctx->args.pdfstoponerror = pvalueref->value.boolval; + } - code = gs_error_typecheck; - if (dict_find_string(pdictref, "PDFDEBUG", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.pdfdebug = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "NOTRANSPARENCY", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.notransparency = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "PDFSTOPONERROR", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.pdfstoponerror = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "QUIET", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.QUIET = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "PDFSTOPONWARNING", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.pdfstoponwarning = pvalueref->value.boolval; - if (pvalueref->value.boolval) - pdfctx->ctx->args.pdfstoponerror = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "VerboseErrors", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.verbose_errors = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "NOTRANSPARENCY", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.notransparency = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "VerboseWarnings", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.verbose_warnings = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "QUIET", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.QUIET = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "PDFPassword", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_string)) + goto error; + pdfctx->ctx->encryption.Password = (char *)gs_alloc_bytes(pdfctx->ctx->memory, r_size(pvalueref) + 1, "PDF Password from zpdfops"); + memset(pdfctx->ctx->encryption.Password, 0x00, r_size(pvalueref) + 1); + memcpy(pdfctx->ctx->encryption.Password, pvalueref->value.const_bytes, r_size(pvalueref)); + pdfctx->ctx->encryption.PasswordLen = r_size(pvalueref); + } - if (dict_find_string(pdictref, "VerboseErrors", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.verbose_errors = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "FirstPage", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_integer)) + goto error; + pdfctx->ctx->args.first_page = pvalueref->value.intval; + } - if (dict_find_string(pdictref, "VerboseWarnings", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.verbose_warnings = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "LastPage", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_integer)) + goto error; + pdfctx->ctx->args.last_page = pvalueref->value.intval; + } - if (dict_find_string(pdictref, "PDFPassword", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_string)) - goto error; - pdfctx->ctx->encryption.Password = (char *)gs_alloc_bytes(pdfctx->ctx->memory, r_size(pvalueref) + 1, "PDF Password from zpdfops"); - memset(pdfctx->ctx->encryption.Password, 0x00, r_size(pvalueref) + 1); - memcpy(pdfctx->ctx->encryption.Password, pvalueref->value.const_bytes, r_size(pvalueref)); - pdfctx->ctx->encryption.PasswordLen = r_size(pvalueref); - } + if (dict_find_string(pdictref, "PDFNOCIDFALLBACK", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.nocidfallback = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "FirstPage", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_integer)) - goto error; - pdfctx->ctx->args.first_page = pvalueref->value.intval; - } + if (dict_find_string(pdictref, "NO_PDFMARK_OUTLINES", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.no_pdfmark_outlines = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "LastPage", &pvalueref) > 0) { + /* This one can be a boolean OR an integer */ + if (dict_find_string(pdictref, "UsePDFX3Profile", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) { if (!r_has_type(pvalueref, t_integer)) goto error; - pdfctx->ctx->args.last_page = pvalueref->value.intval; - } - - if (dict_find_string(pdictref, "PDFNOCIDFALLBACK", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.nocidfallback = pvalueref->value.boolval; + else { + pdfctx->ctx->args.UsePDFX3Profile = true; + pdfctx->ctx->args.PDFX3Profile_num = pvalueref->value.intval; + } + } else { + pdfctx->ctx->args.UsePDFX3Profile = pvalueref->value.boolval; + pdfctx->ctx->args.PDFX3Profile_num = 0; } + } - if (dict_find_string(pdictref, "NO_PDFMARK_OUTLINES", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.no_pdfmark_outlines = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "NO_PDFMARK_DESTS", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.no_pdfmark_dests = pvalueref->value.boolval; + } - /* This one can be a boolean OR an integer */ - if (dict_find_string(pdictref, "UsePDFX3Profile", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) { - if (!r_has_type(pvalueref, t_integer)) - goto error; - else { - pdfctx->ctx->args.UsePDFX3Profile = true; - pdfctx->ctx->args.PDFX3Profile_num = pvalueref->value.intval; - } - } else { - pdfctx->ctx->args.UsePDFX3Profile = pvalueref->value.boolval; - pdfctx->ctx->args.PDFX3Profile_num = 0; - } - } + if (dict_find_string(pdictref, "PDFFitPage", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.pdffitpage = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "NO_PDFMARK_DESTS", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.no_pdfmark_dests = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "OutputFile", &pvalueref) > 0) + pdfctx->ctx->args.printed = true; + else + pdfctx->ctx->args.printed = false; - if (dict_find_string(pdictref, "PDFFitPage", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.pdffitpage = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "Printed", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.printed = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "OutputFile", &pvalueref) > 0) - pdfctx->ctx->args.printed = true; - else - pdfctx->ctx->args.printed = false; + if (dict_find_string(pdictref, "UseBleedBox", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.usebleedbox = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "Printed", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.printed = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "UseCropBox", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.usecropbox = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "UseBleedBox", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.usebleedbox = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "UseArtBox", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.useartbox = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "UseCropBox", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.usecropbox = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "UseTrimBox", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.usetrimbox = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "UseArtBox", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.useartbox = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "ShowAcroForm", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.showacroform = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "UseTrimBox", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.usetrimbox = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "ShowAnnots", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.showannots = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "ShowAcroForm", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.showacroform = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "PreserveAnnots", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.preserveannots = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "ShowAnnots", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.showannots = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "PreserveMarkedContent", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.preservemarkedcontent = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "PreserveAnnots", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.preserveannots = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "PreserveEmbeddedFiles", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.preserveembeddedfiles = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "PreserveMarkedContent", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.preservemarkedcontent = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "PreserveDocView", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.preservedocview = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "NoUserUnit", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.nouserunit = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "NoUserUnit", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.nouserunit = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "RENDERTTNOTDEF", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.renderttnotdef = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "RENDERTTNOTDEF", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.renderttnotdef = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "DOPDFMARKS", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.dopdfmarks = pvalueref->value.boolval; - } + if (dict_find_string(pdictref, "DOPDFMARKS", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.dopdfmarks = pvalueref->value.boolval; + } - if (dict_find_string(pdictref, "PDFINFO", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.pdfinfo = pvalueref->value.boolval; - } - if (dict_find_string(pdictref, "ShowAnnotTypes", &pvalueref) > 0) { - code = param_value_get_namelist(imemory, pdfctx->ctx, pvalueref, - &pdfctx->ctx->args.showannottypes); - if (code < 0) - goto error; - } - if (dict_find_string(pdictref, "PreserveAnnotTypes", &pvalueref) > 0) { - code = param_value_get_namelist(imemory, pdfctx->ctx, pvalueref, - &pdfctx->ctx->args.preserveannottypes); - if (code < 0) - goto error; - } - if (dict_find_string(pdictref, "CIDFSubstPath", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_string)) - goto error; - pdfctx->ctx->args.cidfsubstpath.data = (byte *)gs_alloc_bytes(pdfctx->ctx->memory, r_size(pvalueref) + 1, "PDF cidfsubstpath from zpdfops"); - if (pdfctx->ctx->args.cidfsubstpath.data == NULL) { - code = gs_note_error(gs_error_VMerror); - goto error; - } - memcpy(pdfctx->ctx->args.cidfsubstpath.data, pvalueref->value.const_bytes, r_size(pvalueref)); - pdfctx->ctx->args.cidfsubstpath.size = r_size(pvalueref); - } - if (dict_find_string(pdictref, "CIDFSubstFont", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_string)) - goto error; - pdfctx->ctx->args.cidfsubstfont.data = (byte *)gs_alloc_bytes(pdfctx->ctx->memory, r_size(pvalueref) + 1, "PDF cidfsubstfont from zpdfops"); - if (pdfctx->ctx->args.cidfsubstfont.data == NULL) { - code = gs_note_error(gs_error_VMerror); - goto error; - } - memcpy(pdfctx->ctx->args.cidfsubstfont.data, pvalueref->value.const_bytes, r_size(pvalueref)); - pdfctx->ctx->args.cidfsubstfont.size = r_size(pvalueref); + if (dict_find_string(pdictref, "PDFINFO", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.pdfinfo = pvalueref->value.boolval; + } + if (dict_find_string(pdictref, "ShowAnnotTypes", &pvalueref) > 0) { + code = param_value_get_namelist(imemory, pdfctx->ctx, pvalueref, + &pdfctx->ctx->args.showannottypes); + if (code < 0) + goto error; + } + if (dict_find_string(pdictref, "PreserveAnnotTypes", &pvalueref) > 0) { + code = param_value_get_namelist(imemory, pdfctx->ctx, pvalueref, + &pdfctx->ctx->args.preserveannottypes); + if (code < 0) + goto error; + } + if (dict_find_string(pdictref, "CIDFSubstPath", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_string)) + goto error; + pdfctx->ctx->args.cidfsubstpath.data = (byte *)gs_alloc_bytes(pdfctx->ctx->memory, r_size(pvalueref) + 1, "PDF cidfsubstpath from zpdfops"); + if (pdfctx->ctx->args.cidfsubstpath.data == NULL) { + code = gs_note_error(gs_error_VMerror); + goto error; } - if (dict_find_string(pdictref, "SUBSTFONT", &pvalueref) > 0) { - ref nmstr, *namstrp; - if (r_has_type(pvalueref, t_string)) { - namstrp = pvalueref; - pdfctx->ctx->args.defaultfont_is_name = false; - } else if (r_has_type(pvalueref, t_name)) { - name_string_ref(imemory, pvalueref, &nmstr); - namstrp = &nmstr; - pdfctx->ctx->args.defaultfont_is_name = true; - } - else { - code = gs_note_error(gs_error_typecheck); - goto error; - } - pdfctx->ctx->args.defaultfont.data = (byte *)gs_alloc_bytes(pdfctx->ctx->memory, r_size(namstrp) + 1, "PDF defaultfontname from zpdfops"); - if (pdfctx->ctx->args.defaultfont.data == NULL) { - code = gs_note_error(gs_error_VMerror); - goto error; - } - memcpy(pdfctx->ctx->args.defaultfont.data, pvalueref->value.const_bytes, r_size(namstrp)); - pdfctx->ctx->args.defaultfont.size = r_size(namstrp); + memcpy(pdfctx->ctx->args.cidfsubstpath.data, pvalueref->value.const_bytes, r_size(pvalueref)); + pdfctx->ctx->args.cidfsubstpath.size = r_size(pvalueref); + } + if (dict_find_string(pdictref, "CIDFSubstFont", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_string)) + goto error; + pdfctx->ctx->args.cidfsubstfont.data = (byte *)gs_alloc_bytes(pdfctx->ctx->memory, r_size(pvalueref) + 1, "PDF cidfsubstfont from zpdfops"); + if (pdfctx->ctx->args.cidfsubstfont.data == NULL) { + code = gs_note_error(gs_error_VMerror); + goto error; } - if (dict_find_string(pdictref, "IgnoreToUnicode", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.ignoretounicode = pvalueref->value.boolval; + memcpy(pdfctx->ctx->args.cidfsubstfont.data, pvalueref->value.const_bytes, r_size(pvalueref)); + pdfctx->ctx->args.cidfsubstfont.size = r_size(pvalueref); + } + if (dict_find_string(pdictref, "SUBSTFONT", &pvalueref) > 0) { + ref nmstr, *namstrp; + if (r_has_type(pvalueref, t_string)) { + namstrp = pvalueref; + pdfctx->ctx->args.defaultfont_is_name = false; + } else if (r_has_type(pvalueref, t_name)) { + name_string_ref(imemory, pvalueref, &nmstr); + namstrp = &nmstr; + pdfctx->ctx->args.defaultfont_is_name = true; } - if (dict_find_string(pdictref, "NONATIVEFONTMAP", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_boolean)) - goto error; - pdfctx->ctx->args.nonativefontmap = pvalueref->value.boolval; + else { + code = gs_note_error(gs_error_typecheck); + goto error; } - if (dict_find_string(pdictref, "PageCount", &pvalueref) > 0) { - if (!r_has_type(pvalueref, t_integer)) - goto error; - pdfctx->ctx->Pdfmark_InitialPage = pvalueref->value.intval; + pdfctx->ctx->args.defaultfont.data = (byte *)gs_alloc_bytes(pdfctx->ctx->memory, r_size(namstrp) + 1, "PDF defaultfontname from zpdfops"); + if (pdfctx->ctx->args.defaultfont.data == NULL) { + code = gs_note_error(gs_error_VMerror); + goto error; } - code = 0; + memcpy(pdfctx->ctx->args.defaultfont.data, pvalueref->value.const_bytes, r_size(namstrp)); + pdfctx->ctx->args.defaultfont.size = r_size(namstrp); + } + if (dict_find_string(pdictref, "IgnoreToUnicode", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.ignoretounicode = pvalueref->value.boolval; + } + if (dict_find_string(pdictref, "NONATIVEFONTMAP", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_boolean)) + goto error; + pdfctx->ctx->args.nonativefontmap = pvalueref->value.boolval; + } + if (dict_find_string(pdictref, "PageCount", &pvalueref) > 0) { + if (!r_has_type(pvalueref, t_integer)) + goto error; + pdfctx->ctx->Pdfmark_InitialPage = pvalueref->value.intval; + } + code = 0; + +error: + return code; +} + +static int zPDFSetParams(i_ctx_t *i_ctx_p) +{ + os_ptr op = osp; + int code = 0; + pdfctx_t *pdfctx = NULL; + + check_op(2); + + check_type(*(op - 1), t_pdfctx); + pdfctx = r_ptr(op - 1, pdfctx_t); + + check_type(*op, t_dictionary); + + code = apply_interpreter_params(i_ctx_p, pdfctx, op); + + pop(2); + return code; +} + +static int zPDFInit(i_ctx_t *i_ctx_p) +{ + os_ptr op = osp; + ref *pdictref = NULL, *pvalueref; + pdfctx_t *pdfctx = NULL; + pdf_context *ctx = NULL; + int code = 0; + gs_memory_t *cmem; + + code = gs_memory_chunk_wrap(&cmem, imemory->non_gc_memory); + if (code < 0) + return_error(gs_error_VMerror); + + pdfctx = gs_alloc_struct(imemory, pdfctx_t, &st_pdfctx_t, "PDFcontext"); + if (!pdfctx) { + code = gs_note_error(gs_error_VMerror); + goto error; + } + pdfctx->pdf_memory = cmem; + pdfctx->ctx = NULL; + pdfctx->ps_stream = NULL; + pdfctx->pdf_stream = NULL; + pdfctx->UsingPDFFile = false; + pdfctx->pdf_stream_memory = NULL; + pdfctx->profile_cache = gsicc_profilecache_new(imemory); + if (pdfctx->profile_cache == NULL) { + code = gs_note_error(gs_error_VMerror); + goto error; + } + pdfctx->cache_memory = imemory; + + ctx = pdfi_create_context(cmem); + if (ctx == NULL) { + code = gs_note_error(gs_error_VMerror); + goto error; + } + + pdfctx->ctx = ctx; + get_zfont_glyph_name(&pdfctx->ctx->get_glyph_name); + pdfctx->ctx->get_glyph_index = zpdfi_glyph_index; + + if (ref_stack_count(&o_stack) > 0) { + if (r_has_type(op, t_dictionary)) + code = apply_interpreter_params(i_ctx_p, pdfctx, op); pop(1); + if (code < 0) + goto error; } code = zpdfi_populate_search_paths(i_ctx_p, ctx); if (code < 0) @@ -1694,6 +1736,7 @@ const op_def zpdfops_op_defs[] = {"1.PDFInit", zPDFInit}, {"1.PDFparsePageList", zPDFparsePageList}, {"0.PDFAvailable", zPDFAvailable}, + {"2.PDFSetParams", zPDFSetParams}, #ifdef HAVE_LIBIDN {"1.saslprep", zsaslprep}, #endif |