pdc_encoding pdf_get_hypertextencoding_opt(PDF *p, pdc_resopt *resopts, int *codepage, pdc_bool verbose) { char **strlist; pdc_encoding htenc; if (pdc_get_optvalues("hypertextencoding", resopts, NULL, &strlist)) { int cp; htenc = pdf_get_hypertextencoding(p, strlist[0], &cp, verbose); pdf_check_hypertextencoding(p, htenc); if (codepage) *codepage = cp; } else { htenc = pdf_get_hypertextencoding_param(p, codepage); } return htenc; }
void pdf__set_parameter(PDF *p, const char *key, const char *value) { pdc_pagebox usebox = pdc_pbox_none; pdc_text_format textformat = pdc_auto; char optlist[PDC_GEN_BUFSIZE]; pdf_ppt *ppt; int i, k; i = pdf_get_index(p, key, pdc_true); if (value == NULL) value = ""; ppt = p->curr_ppt; switch (i) { case PDF_PARAMETER_PDIUSEBOX: case PDF_PARAMETER_VIEWAREA: case PDF_PARAMETER_VIEWCLIP: case PDF_PARAMETER_PRINTAREA: case PDF_PARAMETER_PRINTCLIP: k = pdc_get_keycode_ci(value, pdf_usebox_keylist); if (k == PDC_KEY_NOTFOUND) pdc_error(p->pdc, PDC_E_PAR_ILLPARAM, value, key, 0, 0); usebox = (pdc_pagebox) k; pdc_sprintf(p->pdc, pdc_false, optlist, "%s %s", key, value); break; case PDF_PARAMETER_TEXTFORMAT: case PDF_PARAMETER_HYPERTEXTFORMAT: k = pdc_get_keycode_ci(value, pdf_textformat_keylist); if (k == PDC_KEY_NOTFOUND) pdc_error(p->pdc, PDC_E_PAR_ILLPARAM, value, key, 0, 0); textformat = (pdc_text_format) k; break; } switch (i) { case PDF_PARAMETER_SEARCHPATH: case PDF_PARAMETER_FONTAFM: case PDF_PARAMETER_FONTPFM: case PDF_PARAMETER_FONTOUTLINE: case PDF_PARAMETER_HOSTFONT: case PDF_PARAMETER_ENCODING: case PDF_PARAMETER_ICCPROFILE: case PDF_PARAMETER_STANDARDOUTPUTINTENT: { pdf_add_pdflib_resource(p, key, value); break; } case PDF_PARAMETER_DEBUG: { const unsigned char *c; for (c = (const unsigned char *) value; *c; c++) p->debug[(int) *c] = 1; break; } case PDF_PARAMETER_NODEBUG: { const unsigned char *c; for (c = (const unsigned char *) value; *c; c++) p->debug[(int) *c] = 0; break; } case PDF_PARAMETER_BINDING: if (!p->pdc->binding) p->pdc->binding = pdc_strdup(p->pdc, value); break; case PDF_PARAMETER_OBJORIENT: p->pdc->objorient = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_HASTOBEPOS: p->pdc->hastobepos = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_PTFRUN: p->pdc->ptfrun = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_SMOKERUN: p->pdc->smokerun = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_UNICAPLANG: p->pdc->unicaplang = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_ERRORPOLICY: k = pdc_get_keycode_ci(value, pdf_errpol_keylist); if (k == PDC_KEY_NOTFOUND) pdc_error(p->pdc, PDC_E_PAR_ILLPARAM, value, key, 0, 0); p->errorpolicy = (pdf_errpol) k; break; case PDF_PARAMETER_UNDERLINE: pdf_set_tstate(p, (double) pdf_bool_value(p, key, value), to_underline); break; case PDF_PARAMETER_OVERLINE: pdf_set_tstate(p, (double) pdf_bool_value(p, key, value), to_overline); break; case PDF_PARAMETER_STRIKEOUT: pdf_set_tstate(p, (double) pdf_bool_value(p, key, value), to_strikeout); break; case PDF_PARAMETER_KERNING: pdc_warning(p->pdc, PDF_E_UNSUPP_KERNING, 0, 0, 0, 0); break; case PDF_PARAMETER_FAKEBOLD: pdf_set_tstate(p, (double) pdf_bool_value(p, key, value), to_fakebold); break; case PDF_PARAMETER_RESOURCEFILE: pdc_set_resourcefile(p->pdc, value); break; case PDF_PARAMETER_RENDERINGINTENT: k = pdc_get_keycode_ci(value, pdf_renderingintent_pdfkeylist); if (k == PDC_KEY_NOTFOUND) pdc_error(p->pdc, PDC_E_PAR_ILLPARAM, value, key, 0, 0); p->rendintent = (pdf_renderingintent) k; break; case PDF_PARAMETER_PRESERVEOLDPANTONENAMES: p->preserveoldpantonenames = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_SPOTCOLORLOOKUP: p->spotcolorlookup = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_PDISTRICT: p->pdi_strict = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_TOPDOWN: if (pdf_bool_value(p, key, value)) p->ydirection = -1.0; else p->ydirection = 1.0; break; case PDF_PARAMETER_USERCOORDINATES: p->usercoordinates = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_USEHYPERTEXTENCODING: p->usehyptxtenc = pdf_bool_value(p, key, value); break; case PDF_PARAMETER_TEXTFORMAT: pdf_check_textformat(p, textformat); p->textformat = textformat; if (p->curr_ppt) pdf_set_tstate(p, (double) textformat, to_textformat); break; case PDF_PARAMETER_HYPERTEXTFORMAT: pdf_check_hypertextformat(p, textformat); p->hypertextformat = textformat; break; case PDF_PARAMETER_HYPERTEXTENCODING: { p->hypertextencoding = pdf_get_hypertextencoding(p, value, &p->hypertextcodepage, pdc_true); pdf_check_hypertextencoding(p, p->hypertextencoding); break; } case PDF_PARAMETER_CHARREF: pdc_warning(p->pdc, PDF_E_UNSUPP_CHARREF, 0, 0, 0, 0); break; case PDF_PARAMETER_ESCAPESEQUENCE: pdc_warning(p->pdc, PDF_E_UNSUPP_ESCAPESEQU, 0, 0, 0, 0); break; case PDF_PARAMETER_HONORLANG: pdc_warning(p->pdc, PDF_E_UNSUPP_HONORLANG, 0, 0, 0, 0); break; case PDF_PARAMETER_GLYPHCHECK: pdc_warning(p->pdc, PDF_E_UNSUPP_GLYPHCHECK, 0, 0, 0, 0); break; case PDF_PARAMETER_FILLRULE: k = pdc_get_keycode_ci(value, pdf_fillrule_keylist); if (k == PDC_KEY_NOTFOUND) pdc_error(p->pdc, PDC_E_PAR_ILLPARAM, value, key, 0, 0); ppt->fillrule = (pdf_fillrule) k; break; case PDF_PARAMETER_LOGGING: pdc_set_logg_options(p->pdc, value); break; case PDF_PARAMETER_LOGMSG: pdc_logg_cond(p->pdc, 1, trc_user, value); break; case PDF_PARAMETER_TRACEMSG: /* do nothing -- client-supplied string will show up * in the log file */ break; case PDF_PARAMETER_NODEMOSTAMP: break; case PDF_PARAMETER_SERIAL: case PDF_PARAMETER_LICENCE: case PDF_PARAMETER_LICENSE: break; case PDF_PARAMETER_LICENCEFILE: case PDF_PARAMETER_LICENSEFILE: break; case PDF_PARAMETER_AUTOSPACE: pdc_warning(p->pdc, PDF_E_UNSUPP_TAGGED, 0, 0, 0, 0); break; /*****************************************************************************/ /** deprecated historical parameters **/ /*****************************************************************************/ case PDF_PARAMETER_OPENWARNING: p->debug[(int) 'o'] = (char) pdf_bool_value(p, key, value); break; case PDF_PARAMETER_FONTWARNING: p->debug[(int) 'F'] = (char) pdf_bool_value(p, key, value); break; case PDF_PARAMETER_ICCWARNING: p->debug[(int) 'I'] = (char) pdf_bool_value(p, key, value); break; case PDF_PARAMETER_IMAGEWARNING: p->debug[(int) 'i'] = (char) pdf_bool_value(p, key, value); break; case PDF_PARAMETER_PDIWARNING: p->debug[(int) 'p'] = (char) pdf_bool_value(p, key, value); break; case PDF_PARAMETER_HONORICCPROFILE: p->debug[(int) 'e'] = (char) pdf_bool_value(p, key, value); break; case PDF_PARAMETER_GLYPHWARNING: p->debug[(int) 'g'] = (char) pdf_bool_value(p, key, value); if (p->curr_ppt) pdf_set_tstate(p, (double) pdf_bool_value(p, key, value), to_glyphwarning); break; case PDF_PARAMETER_TRACE: { pdc_bool bv = pdf_bool_value(p, key, value); if (bv) pdc_set_logg_options(p->pdc, ""); else pdc_set_logg_options(p->pdc, "disable"); break; } case PDF_PARAMETER_TRACEFILE: pdc_sprintf(p->pdc, pdc_false, optlist, "filename %s", value); pdc_set_logg_options(p->pdc, optlist); break; case PDF_PARAMETER_WARNING: break; case PDF_PARAMETER_MASTERPASSWORD: pdc_warning(p->pdc, PDF_E_UNSUPP_CRYPT, 0, 0, 0, 0); break; case PDF_PARAMETER_USERPASSWORD: pdc_warning(p->pdc, PDF_E_UNSUPP_CRYPT, 0, 0, 0, 0); break; case PDF_PARAMETER_PERMISSIONS: pdc_warning(p->pdc, PDF_E_UNSUPP_CRYPT, 0, 0, 0, 0); break; case PDF_PARAMETER_COMPATIBILITY: pdf_set_compatibility(p, value); break; case PDF_PARAMETER_FLUSH: pdf_set_flush(p, value); break; case PDF_PARAMETER_PDFX: pdc_warning(p->pdc, PDF_E_UNSUPP_PDFX, 0, 0, 0, 0); break; case PDF_PARAMETER_HIDETOOLBAR: case PDF_PARAMETER_HIDEMENUBAR: case PDF_PARAMETER_HIDEWINDOWUI: case PDF_PARAMETER_FITWINDOW: case PDF_PARAMETER_CENTERWINDOW: case PDF_PARAMETER_DISPLAYDOCTITLE: if (pdf_bool_value(p, key, value)) pdf_set_viewerpreference(p, key); break; case PDF_PARAMETER_NONFULLSCREENPAGEMODE: if (!pdc_stricmp(value, "useoutlines")) pdf_set_viewerpreference(p, "nonfullscreenpagemode bookmarks"); else if (!pdc_stricmp(value, "usethumbs")) pdf_set_viewerpreference(p, "nonfullscreenpagemode thumbnails"); else if (!pdc_stricmp(value, "usenone")) pdf_set_viewerpreference(p, "nonfullscreenpagemode none"); else pdc_error(p->pdc, PDC_E_PAR_ILLPARAM, value, key, 0, 0); break; case PDF_PARAMETER_DIRECTION: if (!pdc_stricmp(value, "r2l")) pdf_set_viewerpreference(p, "direction r2l"); else if (!pdc_stricmp(value, "l2r")) pdf_set_viewerpreference(p, "direction l2r"); else pdc_error(p->pdc, PDC_E_PAR_ILLPARAM, value, key, 0, 0); break; case PDF_PARAMETER_VIEWAREA: case PDF_PARAMETER_VIEWCLIP: case PDF_PARAMETER_PRINTAREA: case PDF_PARAMETER_PRINTCLIP: pdf_set_viewerpreference(p, optlist); break; case PDF_PARAMETER_OPENACTION: pdf_set_openaction(p, value); break; case PDF_PARAMETER_OPENMODE: pdf_set_openmode(p, value); break; case PDF_PARAMETER_BOOKMARKDEST: pdf_cleanup_destination(p, p->bookmark_dest); p->bookmark_dest = pdf_parse_destination_optlist(p, value, 0, pdf_bookmark); break; case PDF_PARAMETER_INHERITGSTATE: (void) pdf_bool_value(p, key, value); break; case PDF_PARAMETER_TRANSITION: pdf_set_transition(p, value); break; case PDF_PARAMETER_BASE: pdf_set_uri(p, value); break; case PDF_PARAMETER_LAUNCHLINK_PARAMETERS: if (p->launchlink_parameters) { pdc_free(p->pdc, p->launchlink_parameters); p->launchlink_parameters = NULL; } p->launchlink_parameters = pdc_strdup(p->pdc, value); break; case PDF_PARAMETER_LAUNCHLINK_OPERATION: if (p->launchlink_operation) { pdc_free(p->pdc, p->launchlink_operation); p->launchlink_operation = NULL; } p->launchlink_operation = pdc_strdup(p->pdc, value); break; case PDF_PARAMETER_LAUNCHLINK_DEFAULTDIR: if (p->launchlink_defaultdir) { pdc_free(p->pdc, p->launchlink_defaultdir); p->launchlink_defaultdir = NULL; } p->launchlink_defaultdir = pdc_strdup(p->pdc, value); break; case PDF_PARAMETER_PDIUSEBOX: p->pdi_usebox = usebox; break; case PDF_PARAMETER_AUTOSUBSETTING: case PDF_PARAMETER_AUTOCIDFONT: case PDF_PARAMETER_UNICODEMAP: pdc_warning(p->pdc, PDF_E_UNSUPP_UNICODE, 0, 0, 0, 0); break; default: pdc_error(p->pdc, PDC_E_PAR_UNKNOWNKEY, key, 0, 0, 0); break; } /* switch */ } /* pdf__set_parameter */
char * pdf_get_opt_filename(PDF *p, const char *keyword, pdc_resopt *resopts, pdc_encoding enc, int codepage) { pdc_bool logg1 = pdc_logg_is_enabled(p->pdc, 1, trc_optlist); pdc_bool logg3 = pdc_logg_is_enabled(p->pdc, 3, trc_text); pdc_byte *filename = NULL; char **strlist; if (pdc_get_optvalues(keyword, resopts, NULL, &strlist)) { pdc_encodingvector *inev = NULL, *outev = NULL; pdc_text_format intextformat = pdc_bytes; pdc_text_format outtextformat = pdc_utf16; /* sic! */ int convflags = PDC_CONV_NOBOM | PDC_CONV_TRYBYTES | PDC_CONV_NEWALLOC; pdc_bool isutf8; int ic, outlen; /* whole option list or string list is in UTF-8 */ isutf8 = pdc_is_lastopt_utf8(resopts); if (!isutf8) { if (enc < 0 && enc != pdc_unicode && enc != pdc_cid) enc = pdf_get_hypertextencoding(p, "auto", &codepage, pdc_true); if (enc >= 0) inev = pdc_get_encoding_vector(p->pdc, enc); } else { intextformat = PDC_UTF8; } if (logg1) { if (isutf8) { pdc_logg(p->pdc, "\tOption \"%s\" is "PDC_UTF8_STRG" encoded\n", keyword); } else { pdc_logg(p->pdc, "\tOption \"%s\" is %s encoded\n", keyword, pdc_get_user_encoding(p->pdc, enc)); } } outev = pdc_get_encoding_vector(p->pdc, pdc_winansi); if (logg3) convflags |= PDC_CONV_LOGGING; pdf_set_convertflags(p, &convflags); pdc_convert_string(p->pdc, intextformat, codepage, inev, (pdc_byte *) strlist[0], (int) strlen(strlist[0]), &outtextformat, outev, &filename, &outlen, convflags, pdc_true); if (outtextformat == pdc_utf16) { pdc_ushort uv, *unifilename = (pdc_ushort *) filename; int code; if (p->compatibility < PDC_1_7) pdc_error(p->pdc, PDC_E_IO_UNSUPP_PDFUNINAME, 0, 0, 0, 0); /* we must replace non-WinAnsi characters by period * and omit the BOM to get a WinAnsi string. */ outlen /= 2; for (ic = 0; ic < outlen; ic++) { uv = unifilename[ic]; code = pdc_get_encoding_bytecode(p->pdc, outev, uv); if (code <= 0) uv = PDC_UNICODE_PERIOD; filename[ic] = (char) uv; } filename[ic] = 0; } if (logg3) pdc_logg_hexdump(p->pdc, "output filename", "\t\t", (char *) filename, strlen((char *) filename)); } return (char *) filename; }
int pdf_get_opt_textlist(PDF *p, const char *keyword, pdc_resopt *resopts, pdc_encoding enc, int codepage, pdc_bool ishypertext, const char *fieldname, char **text, char ***textlist) { pdc_bool logg1 = pdc_logg_is_enabled(p->pdc, 1, trc_optlist); int ns; char **strlist; ns = pdc_get_optvalues(keyword, resopts, NULL, &strlist); if (ns) { pdc_byte *string = NULL; pdc_encodingvector *inev = NULL, *outev = NULL; pdc_text_format intextformat = pdc_bytes; pdc_text_format outtextformat = pdc_utf16be; pdc_text_format textformat; int convflags = PDC_CONV_WITHBOM; pdc_bool isutf8; int i, outlen; /* whole option list or string list is in UTF-8 */ isutf8 = pdc_is_lastopt_utf8(resopts); /* Encoding */ if (ishypertext) { /* Initialize */ if (!isutf8) { if (enc < 0 && enc != pdc_unicode && enc != pdc_cid) enc = pdf_get_hypertextencoding(p, "auto", &codepage, pdc_true); if (enc >= 0) inev = pdc_get_encoding_vector(p->pdc, enc); } outev = pdc_get_encoding_vector(p->pdc, pdc_pdfdoc); /* conversion to PDFDocEncoding if possible */ convflags |= PDC_CONV_TRYBYTES; } else { if (enc == pdc_invalidenc) { if (fieldname) { pdc_cleanup_optionlist(p->pdc, resopts); pdc_error(p->pdc, PDF_E_FF_FONTMISSING, fieldname, 0, 0, 0); } return 0; } else if (enc >= 0 && !isutf8) { /* bug #2069: always conversion to UTF-16BE */ inev = pdc_get_encoding_vector(p->pdc, enc); } } if (logg1) { if (isutf8) { pdc_logg(p->pdc, "\tOption \"%s\" is "PDC_UTF8_STRG" encoded\n", keyword); } else { pdc_logg(p->pdc, "\tOption \"%s\" is %s encoded\n", keyword, pdc_get_user_encoding(p->pdc, enc)); } } for (i = 0; i < ns; i++) { string = (pdc_byte *) strlist[i]; { if (ishypertext || isutf8 || inev != NULL) { intextformat = isutf8 ? PDC_UTF8 : pdc_bytes; if (pdc_logg_is_enabled(p->pdc, 3, trc_text)) convflags |= PDC_CONV_LOGGING; pdf_set_convertflags(p, &convflags); textformat = outtextformat; pdc_convert_string(p->pdc, intextformat, codepage, inev, string, (int) strlen((char *) string), &textformat, outev, &string, &outlen, convflags, pdc_true); pdc_free(p->pdc, strlist[i]); strlist[i] = (char *) string; } } } if (text) *text = strlist[0]; else *textlist = strlist; if (fieldname) { strlist = (char **) pdc_save_lastopt(resopts, PDC_OPT_SAVEALL); pdf_insert_stringlist(p, strlist, ns); } } return ns; }