如何将PDF签名写入MySQL数据库

尼克·马奇特(Nick Mudgett)

我已经开发了一份PDF表格,供公司跟踪里程费用。用户完成操作后,用户可通过单击按钮提交文档。提交后,它将发布到php网页,并将字段信息写入MySQL数据库。一切都很好,但是我们要求用户使用PDF电子签名字段对文档进行签名。我无法将签名发布或写入数据库。字段名称是签名。任何帮助都会很棒。

代码如下(无签名):

<?php

    include_once('../php/functions.php');

    $sig_month = $_POST['sig_month'];
    $sig_day = $_POST['sig_day'];
    $sig_year = $_POST['sig_year'];
    $mileage_rate = $_POST['mileage_rate'];
    $form_id = $_POST['form_id'];
    $submission_date = $_POST['submission_date'];
    $signed = $_POST['signed'];
    $employee_name = $_POST['employee_name']; 

    if(strlen($sig_month) == 1){
        $sig_month = "0".$sig_month;
    }
    if(strlen($sig_day) == 1){
        $sig_day = "0".$sig_day;
    }

    $employee_initial = $employee_name[0];
    $employee_explode = explode(" ", $employee_name);
    $employee_email = $employee_initial . $employee_explode[1];
    $employee_email = strtolower($employee_email) . "@fbhi.net";

    $mileage_rate = "0.".$mileage_rate;

    $query="SELECT * FROM employee WHERE email = '$employee_email'";
    $ifExists = ifExists($query,$db_con);   

    if($ifExists > 0){

        $result = queryMysqli($query,$db_con);

        while($row = mysqli_fetch_array($result)){

            $employee_name = $row['first_name'] . " " . $row['last_name'];
            $error = 0;
            $success = 0;
            $x = 1;

            $query1 = "DELETE FROM mileage_form WHERE form_id = '$form_id'";
            if(!queryMysqli($query1,$db_con)){

                $error++;

            }           

            while($x < 8){

                $month = $_POST['month_day'.$x];
                $day = $_POST['day_day'.$x];
                $year = $_POST['year_day'.$x];
                $purpose = $_POST['purpose_day'.$x];
                $miles = $_POST['miles_day'.$x];

                if(strlen($month) == 1){
                    $month = "0".$month;
                }
                if(strlen($day) == 1){
                    $day = "0".$day;
                }

                if($employee_name != "" && $mileage_rate != "" && $month != "" && $day != "" && $year != "" && $purpose != "" && $miles != "" && $form_id != "" && $submission_date != "" && $sig_month != "" && $sig_day != "" && $sig_year != "" && $signed == "t"){

                    $query = "INSERT INTO mileage_form (employee_name,mileage_rate,month,day,year,purpose,miles,sig_month,sig_day,sig_year,submission_date,signed,form_id)
                    VALUES ('$employee_name','$mileage_rate','$month','$day','$year','$purpose','$miles','$sig_month','$sig_day','$sig_year','$submission_date','$signed','$form_id')";
                    if(!queryMysqli($query,$db_con)){
                            $error++;
                        }else{
                            $success++;
                        }

                }
                $x++;
            }

            if($error != 0){
                echo "Something went wrong! Your mileage claims did not submit!";
            }

            if($success != 0){
                echo "<center>Mileage claims have been submitted for <br /><font size=6><strong>$employee_email</strong/></font><br />If this is not the correct email, contact your IT Administrator immediately!";
            }else{

                echo "Your mileage form is incomplete. Ensure all of the required information is finished, and then resubmit your form.";

            }


        }

    }else{

        echo "<center>Sorry, your email is not registered in our database. If you are positive your email is $employee_email, please contact your IT Administrator";

    }
?>
mkl

当前的PDF表单是以HTML表单格式提交的常规(即非XFA)PDF表单。

对于这样提交的表单,提交签名字段的内容没有任何意义,因此无法完成。

因此,要访问签名信息,您必须更改表单以提交为整个PDF(带有填充字段)或使用IncludeAppendSaves作为FDF提交。

另外,您可以考虑仅XFA表单和XFA签名签署表单数据。

无论如何,您都必须重写PDF和表单数据检索。

一些细节:

签名值在HTML表单格式提交中毫无意义

数字签名通常对某些字节数组进行签名。对于集成的PDF签名,此字节数组由整个PDF组成,仅不包括为签名本身保留的范围:

集成的PDF签名原理图

(有关更多详细信息和指向涵盖此问题的文档的指针,请参阅此答案。

对于手头的文档,这些签名的字节范围不仅包括原始PDF和表单填充,还包括新的PDF元数据和签名详细信息。通过HTML表单格式检索表单值时,您无权访问这些元数据:例如,您不知道确切的修改日期时间或新生成的PDF文档标识符(存储在元数据中)。

因此,单独的签名对您没有任何意义,因为您没有原始签名的文档来验证签名。因此,任何人都可以简单地从其他文档中复制签名并将其一起发送,您将没有机会认识到欺诈行为。

解决方案1:发送整个PDF

PDF提交表单操作允许您请求发送整个PDF,而不仅仅是表单字段值。cf. PDF规范ISO 32000-1中表237提交表单操作的标志中说明SubmitPDF标志

如果设置了该文档,则应使用MIME内容类型application / pdf(在Internet RFC 2045,多用途Internet邮件扩展(MIME),第1部分:Internet邮件正文的格式中进行了描述;请参见参考书目)以PDF格式提交。

当您获得整个PDF时,您可以使用常规PDF库提取包括签名在内的所有表单值,还可以验证签名(从而肯定标识填写该表单的人)。

明显的缺点是传输的数据量。

解决方案2:发送PDF更新部分

PDF文件格式允许将文件更改附加到文件结尾,而无需更改原始文件内容:

增量更新原理图

使用这种技术,只需要转发主要由表单填写和签名组成的附加内容就足够了。

PDF提交表单操作允许您请求此操作。cf. PDF规范ISO 32000-1中的表237用于提交表单操作的标志中说明IncludeAppendSaves标志

如果设置,则提交的FDF文件应包括对基础PDF文档的所有增量更新的内容,如FDF词典中的Differences条目中所包含的(请参见表243)。

In Table 243 Entries in the FDF dictionary you even find this hint containing signatures:

This allows any digital signatures (see 12.8, “Digital Signatures”) to be transmitted to the server.

In contrast to solution 1 this requires transmission of a fairly small amount of data. The transmitted data, though, are in FDF, a format similar but not identical to PDF. I don't know which libraries are available to you for FDF reading.

Solution 3: Using XFA form technologies

Yet another solution is to switch from regular PDF forms to XFA (Adobe XML Form Architecture) forms. Essentially this uses XML as format for holding form information and allows XML signatures to sign merely the XML, not all of the PDF. This may give rise to a solution with fairly little bandwidth use which is built on standard XML technologies.

不过,我对XFA不太了解,因此无法详细介绍。

肮脏,三心二意的工作环境

如果事实证明您无法访问发布的PDF或FDF数据(我不知道PHP在这方面的合作程度),并且您对验证签名也没有真正的兴趣,而只是将签名放入数据库中,则可以尝试在PDF中使用JavaScript来深度复制签名字段的内容,对其进行文本编码,然后将其放入某些隐藏的文本字段中。

这样,您将从以HTML表单格式提交的隐藏字段中获得签名。您只是无法验证它是否实际在表单上签名。;)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将数据从PHP插入MySQL数据库

来自分类Dev

如何将数据从TableView写入pdf?

来自分类Dev

如何将元素插入mysql数据库

来自分类Dev

如何将网站连接到MYSQL数据库?

来自分类Dev

如何将yml文件导入MySQL数据库?

来自分类Dev

如何将JSON数组插入MySQL数据库

来自分类Dev

如何将映像插入mysql数据库

来自分类Dev

如何将MySQL数据库导出为CSV

来自分类Dev

如何将网站连接到MYSQL数据库?

来自分类Dev

如何将JSON数组插入MySQL数据库

来自分类Dev

如何将映像插入mysql数据库

来自分类Dev

如何将json值插入mysql数据库

来自分类Dev

如何将MySQL数据库导出为CSV

来自分类Dev

如何将MySQL数据库导入OpenShift?

来自分类Dev

如何将R数据帧写入Snowflake数据库表

来自分类Dev

如何将Azure静态Web表单数据发送/写入Azure SQL数据库

来自分类Dev

如何将数据库日志中的数据写入任何逻辑中的输出?

来自分类Dev

如何将托管的mysql数据库导入本地主机数据库?

来自分类Dev

如何将MySQL远程数据库表插入本地数据库表?

来自分类Dev

如何将Python复合键,值字典写入数据库?

来自分类Dev

如何将流查询的结果写入多个数据库表?

来自分类Dev

Java如何将变量写入H2数据库

来自分类Dev

在begin / commit / rollback块中时如何将更改写入数据库

来自分类Dev

如何将单选按钮值写入Sql数据库?

来自分类Dev

如何将Monolog日志写入文件和远程数据库

来自分类Dev

MySQL通过C#将数据写入数据库

来自分类Dev

如何使用C#将数据写入mysql数据库并忽略列

来自分类Dev

如何将数据从phpmyadmin数据库保存到pdf?

来自分类Dev

如何将数据从Oracle 11gR2数据库表迁移到MySQL数据库表?

Related 相关文章

热门标签

归档