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

时间:2014-02-17 18:42:00

标签: php mysql pdf

我开发了一份我公司用来跟踪里程费用的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";

    }
?>

1 个答案:

答案 0 :(得分:0)

手头的PDF表格是以HTML表格格式提交的常规(即非XFA)PDF表格。

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

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

或者,您可以考虑仅签署表单数据的XFA表单和XFA签名。

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

一些细节:

在HTML表单格式提交

时,签名值没有意义

数字签名通常会签署一些字节数组。在集成PDF签名的情况下,此字节数组由整个PDF组成,仅排除为签名本身保留的范围:

Integrated PDF signature schematic

(有关详细内容及更深入的文档指南,请参阅this answer.

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

因此,单独签名对您没有任何价值,因为您没有最初签名的文档来验证签名。因此,任何人都可以简单地从其他文档中复制签名并将其发送出去,而您将无法识别欺诈行为。

解决方案1:发送整个PDF

PDF 提交表单操作允许您请求发送整个PDF而不仅仅是表单字段值。参看表格237中的 SubmitPDF 标志在PDF规范ISO 32000-1中提交了提交表单操作标志

  

如果设置,则文档应以PDF格式提交,使用MIME内容类型application / pdf(在Internet RFC 2045,多用途Internet邮件扩展(MIME),第一部分:Internet消息体格式中描述;参见参考书目)

当你获得整个PDF时,你可以使用普通的PDF库提取所有表格值,包括签名,你也可以验证签名(并积极地识别填写该表格的人)。

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

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

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

Incremental Update schematic

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

PDF 提交表单操作允许您请求此操作。参看表格237中的 IncludeAppendSaves 标志在PDF规范ISO 32000-1中提交提交表单操作标志

  

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

在表243 FDF词典中的条目中,您甚至可以找到包含签名的提示:

  

这允许将任何数字签名(见12.8,“数字签名”)传输到服务器。

与解决方案1相比,这需要传输相当少量的数据。但是,传输的数据是FDF,格式与PDF类似但不完全相同。我不知道哪些库可用于FDF阅读。

解决方案3:使用XFA表单技术

另一种解决方案是从常规PDF表单切换到XFA(Adobe XML表单体系结构)表单。本质上,这使用XML作为格式来保存表单信息,并允许XML签名仅签署XML,而不是所有PDF。这可能会产生一种基于标准XML技术的带宽使用率相当低的解决方案。

我对XFA知之甚少,并且不能详细说明。

肮脏,半心半意的工作

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

这样您就可以从HTML表单格式提交的隐藏字段中获取签名。您只是无法验证它是否实际签署了表单。 ;)