📄 fdf.c
字号:
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Authors: Uwe Steinmann <Uwe.Steinmann@fernuni-hagen.de> | | Hartmut Holzgraefe <hholzgra@php.net> | +----------------------------------------------------------------------+ *//* $Id: fdf.c,v 1.66.2.13.2.5 2007/03/05 22:12:19 stas Exp $ *//* FdfTk lib 2.0 is a Complete C/C++ FDF Toolkit available from http://beta1.adobe.com/ada/acrosdk/forms.html. *//* Note that there is no code from the FdfTk lib in this file */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include "php_open_temporary_file.h"#if HAVE_FDFLIB#include "SAPI.h"#include "ext/standard/info.h"#include "php_open_temporary_file.h"#include "php_variables.h"#include "php_fdf.h"#ifndef S_ISDIR#define S_ISDIR(m) (((m) & _S_IFDIR) == _S_IFDIR)#endifstatic int le_fdf;SAPI_POST_HANDLER_FUNC(fdf_post_handler);/* {{{ fdf_functions[] */function_entry fdf_functions[] = { PHP_FE(fdf_add_template, NULL) PHP_FE(fdf_close, NULL) PHP_FE(fdf_create, NULL) PHP_FE(fdf_enum_values, NULL) PHP_FE(fdf_errno, NULL) PHP_FE(fdf_error, NULL) PHP_FE(fdf_get_ap, NULL) PHP_FE(fdf_get_encoding, NULL) PHP_FE(fdf_get_file, NULL) PHP_FE(fdf_get_flags, NULL) PHP_FE(fdf_get_opt, NULL) PHP_FE(fdf_get_status, NULL) PHP_FE(fdf_get_value, NULL) PHP_FE(fdf_get_version, NULL) PHP_FE(fdf_next_field_name, NULL) PHP_FE(fdf_open, NULL) PHP_FE(fdf_open_string, NULL) PHP_FE(fdf_remove_item, NULL) PHP_FE(fdf_save, NULL) PHP_FE(fdf_save_string, NULL) PHP_FE(fdf_set_ap, NULL) PHP_FE(fdf_set_encoding, NULL) PHP_FE(fdf_set_file, NULL) PHP_FE(fdf_set_flags, NULL) PHP_FE(fdf_set_javascript_action, NULL) PHP_FE(fdf_set_opt, NULL) PHP_FE(fdf_set_status, NULL) PHP_FE(fdf_set_submit_form_action, NULL) PHP_FE(fdf_set_value, NULL) PHP_FE(fdf_header, NULL)#ifdef HAVE_FDFTK_5 PHP_FE(fdf_add_doc_javascript, NULL) PHP_FE(fdf_get_attachment, NULL) PHP_FE(fdf_set_on_import_javascript, NULL) PHP_FE(fdf_set_target_frame, NULL) PHP_FE(fdf_set_version, NULL)#endif {NULL, NULL, NULL}};/* }}} */zend_module_entry fdf_module_entry = { STANDARD_MODULE_HEADER, "fdf", fdf_functions, PHP_MINIT(fdf), PHP_MSHUTDOWN(fdf), PHP_RINIT(fdf), NULL, PHP_MINFO(fdf), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_FDFZEND_GET_MODULE(fdf)#endifZEND_DECLARE_MODULE_GLOBALS(fdf)#define FDF_SUCCESS do { FDF_G(error)=FDFErcOK; RETURN_TRUE;} while(0)#define FDF_FAILURE(err) do { FDF_G(error)=err; RETURN_FALSE;} while(0)static void phpi_FDFClose(zend_rsrc_list_entry *rsrc TSRMLS_DC){ FDFDoc fdf = (FDFDoc)rsrc->ptr; (void) FDFClose(fdf);}#define FDF_POST_CONTENT_TYPE "application/vnd.fdf"static sapi_post_entry php_fdf_post_entry = { FDF_POST_CONTENT_TYPE, sizeof(FDF_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, fdf_post_handler};static void php_fdf_init_globals(zend_fdf_globals *fdf_globals){ memset(fdf_globals, 0, sizeof(*fdf_globals));}/* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(fdf){ ZEND_INIT_MODULE_GLOBALS(fdf, php_fdf_init_globals, NULL); le_fdf = zend_register_list_destructors_ex(phpi_FDFClose, NULL, "fdf", module_number); /* add handler for Acrobat FDF form post requests */ sapi_register_post_entry(&php_fdf_post_entry); /* Constants used by fdf_set_opt() */ REGISTER_LONG_CONSTANT("FDFValue", FDFValue, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFStatus", FDFStatus, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFFile", FDFFile, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFID", FDFID, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFFf", FDFFf, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFSetFf", FDFSetFf, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFClearFf", FDFClearFf, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFFlags", FDFFlags, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFSetF", FDFSetF, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFClrF", FDFClrF, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFAP", FDFAP, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFAS", FDFAS, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFAction", FDFAction, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFAA", FDFAA, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFAPRef", FDFAPRef, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFIF", FDFIF, CONST_CS | CONST_PERSISTENT); /* Constants used by fdf_set_javascript_action() */ REGISTER_LONG_CONSTANT("FDFEnter", FDFEnter, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFExit", FDFExit, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFDown", FDFDown, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFUp", FDFUp, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFFormat", FDFFormat, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFValidate", FDFValidate, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFKeystroke", FDFKeystroke, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFCalculate", FDFCalculate, CONST_CS | CONST_PERSISTENT); /* Constants used by fdf_(set|get)_ap */ REGISTER_LONG_CONSTANT("FDFNormalAP", 1, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFRolloverAP", 2, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("FDFDownAP", 3, CONST_CS | CONST_PERSISTENT); #ifdef PHP_WIN32 return SUCCESS;#else return (FDFInitialize() == FDFErcOK) ? SUCCESS : FAILURE;#endif}/* }}} *//* {{{ RINIT */PHP_RINIT_FUNCTION(fdf){ return SUCCESS;}/* }}} *//* {{{ PHP_MINFO_FUNCTION */PHP_MINFO_FUNCTION(fdf){ /* need to use a PHPAPI function here because it is external module in windows */ php_info_print_table_start(); php_info_print_table_row(2, "FDF Support", "enabled"); php_info_print_table_row(2, "FdfTk Version", FDFGetVersion() ); php_info_print_table_end();}/* }}} *//* {{{ PHP_MSHUTDOWN_FUNCTION */PHP_MSHUTDOWN_FUNCTION(fdf){ /* remove handler for Acrobat FDF form post requests */ sapi_unregister_post_entry(&php_fdf_post_entry); #ifdef PHP_WIN32 return SUCCESS;#else return (FDFFinalize() == FDFErcOK) ? SUCCESS : FAILURE;#endif}/* }}} *//* {{{ proto resource fdf_open(string filename) Opens a new FDF document */PHP_FUNCTION(fdf_open) { zval **file; FDFDoc fdf; FDFErc err; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &file) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(file); if (php_check_open_basedir(Z_STRVAL_PP(file) TSRMLS_CC) || (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(file), "wb+", CHECKUID_CHECK_MODE_PARAM))) { RETURN_FALSE; } err = FDFOpen(Z_STRVAL_PP(file), 0, &fdf); if(err != FDFErcOK || !fdf) { if(err == FDFErcOK) err= FDFErcInternalError; FDF_FAILURE(err); } ZEND_REGISTER_RESOURCE(return_value, fdf, le_fdf);} /* }}} *//* {{{ proto resource fdf_open_string(string fdf_data) Opens a new FDF document from string */PHP_FUNCTION(fdf_open_string) { char *fdf_data; int fdf_data_len; FDFDoc fdf; FDFErc err; char *temp_filename; FILE *fp; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &fdf_data, &fdf_data_len) == FAILURE) { return; } fp = php_open_temporary_file(PG(upload_tmp_dir), "php", &temp_filename TSRMLS_CC); if(!fp) { RETURN_FALSE; } fwrite(fdf_data, fdf_data_len, 1, fp); fclose(fp); err = FDFOpen(temp_filename, 0, &fdf); unlink(temp_filename); efree(temp_filename); if(err != FDFErcOK || !fdf) { if(err == FDFErcOK) err= FDFErcInternalError; FDF_FAILURE(err); } ZEND_REGISTER_RESOURCE(return_value, fdf, le_fdf);} /* }}} *//* {{{ proto resource fdf_create(void) Creates a new FDF document */PHP_FUNCTION(fdf_create) { FDFDoc fdf; FDFErc err; if (ZEND_NUM_ARGS() != 0) { WRONG_PARAM_COUNT; } err = FDFCreate(&fdf); if(err != FDFErcOK || !fdf) { if(err == FDFErcOK) err= FDFErcInternalError; FDF_FAILURE(err); } ZEND_REGISTER_RESOURCE(return_value, fdf, le_fdf);}/* }}} *//* {{{ proto bool fdf_close(resource fdfdoc) Closes the FDF document */PHP_FUNCTION(fdf_close) { zval **fdfp; FDFDoc fdf; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &fdfp) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(fdf, FDFDoc *, fdfp, -1, "fdf", le_fdf); zend_list_delete(Z_RESVAL_PP(fdfp));} /* }}} *//* {{{ proto string fdf_get_value(resource fdfdoc, string fieldname [, int which]) Gets the value of a field as string */PHP_FUNCTION(fdf_get_value) { zval *r_fdf; char *fieldname; int fieldname_len; long which = -1; FDFDoc fdf; FDFErc err; ASInt32 nr, size = 256; char *buffer; if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|l", &r_fdf, &fieldname, &fieldname_len, &which) == FAILURE) { return; } ZEND_FETCH_RESOURCE(fdf, FDFDoc *, &r_fdf, -1, "fdf", le_fdf); buffer = emalloc(size); if(which >= 0) {#if HAVE_FDFTK_5 err = FDFGetNthValue(fdf, fieldname, which, buffer, size-2, &nr);#else php_error_docref(NULL TSRMLS_CC, E_WARNING, "the optional 'which' parameter requires FDF toolkit 5.0 or above, it will be ignored for now"); which = -1;#endif } else { err = FDFGetValue(fdf, fieldname, buffer, size-2, &nr); } if(err == FDFErcBufTooShort && nr > 0 ) { buffer = erealloc(buffer, nr+2); if(which >= 0) {#if HAVE_FDFTK_5 err = FDFGetNthValue(fdf, fieldname, which, buffer, nr, &nr);#endif } else { err = FDFGetValue(fdf, fieldname, buffer, nr, &nr); } #if HAVE_FDFTK_5 } else if((err == FDFErcValueIsArray) && (which == -1)) { array_init(return_value); which = 0; do { err = FDFGetNthValue(fdf, fieldname, which, buffer, size-2, &nr); if(err == FDFErcBufTooShort && nr > 0 ) { buffer = erealloc(buffer, nr+2); err = FDFGetNthValue(fdf, fieldname, which, buffer, nr, &nr); } if (err == FDFErcOK) { add_next_index_string(return_value, buffer, 1); } which++; } while (err == FDFErcOK); efree(buffer); buffer = NULL;#endif } if ((err != FDFErcOK) && (err != FDFErcNoValue)) { if(buffer) efree(buffer); FDF_FAILURE(err); } if(buffer) { RETVAL_STRING(buffer, 1); efree(buffer); } return;}/* }}} *//* {{{ proto bool fdf_set_value(resource fdfdoc, string fieldname, mixed value [, int isname]) Sets the value of a field */PHP_FUNCTION(fdf_set_value) { zval **fdfp, **fieldname, **value, **dummy; FDFDoc fdf; FDFErc err; switch(ZEND_NUM_ARGS()) { case 3: if (zend_get_parameters_ex(3, &fdfp, &fieldname, &value) == FAILURE) { WRONG_PARAM_COUNT; } break; case 4: if (zend_get_parameters_ex(4, &fdfp, &fieldname, &value, &dummy) == FAILURE) { WRONG_PARAM_COUNT; } break; default: WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(fdf, FDFDoc *, fdfp, -1, "fdf", le_fdf); convert_to_string_ex(fieldname); if (Z_TYPE_PP(value) == IS_ARRAY) {#ifdef HAVE_FDFTK_5 ASInt32 nValues = zend_hash_num_elements(Z_ARRVAL_PP(value)); char **newValues = ecalloc(nValues, sizeof(char *)), **next; HashPosition pos; zval **tmp; next = newValues; zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(value), &pos); while (zend_hash_get_current_data_ex(Z_ARRVAL_PP(value), (void **) &tmp, &pos) == SUCCESS) { convert_to_string_ex(tmp); *next++ = estrdup(Z_STRVAL_PP(tmp)); zend_hash_move_forward_ex(Z_ARRVAL_PP(value), &pos); } err = FDFSetValues(fdf, Z_STRVAL_PP(fieldname), nValues, (const char **)newValues); for(next = newValues; nValues; nValues--) { efree(*next++); } efree(newValues);#else php_error_docref(NULL TSRMLS_CC, E_WARNING, "setting array values is only possible with FDF toolkit 5.0 and above"); RETURN_FALSE;#endif } else { convert_to_string_ex(value); err = FDFSetValue(fdf, Z_STRVAL_PP(fieldname), Z_STRVAL_PP(value), (ASBool)0 /*dummy*/); } if(err != FDFErcOK) { FDF_FAILURE(err); } FDF_SUCCESS;}/* }}} *//* {{{ proto string fdf_next_field_name(resource fdfdoc [, string fieldname]) Gets the name of the next field name or the first field name */PHP_FUNCTION(fdf_next_field_name) { zval **fdfp, **field; int argc=ZEND_NUM_ARGS(); ASInt32 length=256, nr; char *buffer=NULL, *fieldname=NULL; FDFDoc fdf; FDFErc err; if (argc > 2 || argc < 1 || zend_get_parameters_ex(argc, &fdfp, &field) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(fdf, FDFDoc *, fdfp, -1, "fdf", le_fdf); if(argc == 2) { convert_to_string_ex(field); fieldname = Z_STRVAL_PP(field); } buffer = emalloc(length); err = FDFNextFieldName(fdf, fieldname, buffer, length-1, &nr); if(err == FDFErcBufTooShort && nr > 0 ) { buffer = erealloc(buffer, nr+1); err = FDFNextFieldName(fdf, fieldname, buffer, length-1, &nr); } if(err != FDFErcOK) { efree(buffer); FDF_FAILURE(err); } RETVAL_STRING(buffer, 1); efree(buffer);}/* }}} *//* {{{ proto bool fdf_set_ap(resource fdfdoc, string fieldname, int face, string filename, int pagenr) Sets the appearence of a field */PHP_FUNCTION(fdf_set_ap) { zval **fdfp, **fieldname, **face, **filename, **pagenr; FDFDoc fdf; FDFErc err; FDFAppFace facenr; if (ZEND_NUM_ARGS() != 5 || zend_get_parameters_ex(5, &fdfp, &fieldname, &face, &filename, &pagenr) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(fdf, FDFDoc *, fdfp, -1, "fdf", le_fdf); convert_to_string_ex(fieldname); convert_to_long_ex(face); convert_to_string_ex(filename); if (php_check_open_basedir(Z_STRVAL_PP(filename) TSRMLS_CC) || (PG(safe_mode) && !php_checkuid(Z_STRVAL_PP(filename), "wb+", CHECKUID_CHECK_MODE_PARAM))) { RETURN_FALSE; } convert_to_long_ex(pagenr); switch(Z_LVAL_PP(face)) { case 1: facenr = FDFNormalAP; break; case 2: facenr = FDFRolloverAP; break; case 3: facenr = FDFDownAP; break; default:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -