【问题标题】:How to write PDF Signature to MySQL Database如何将 PDF 签名写入 MySQL 数据库
【发布时间】:2014-03-17 04:56:09
【问题描述】:

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

    }
?>

【问题讨论】:

  • 我们需要查看您使用的“签名”代码。我们无法猜测将什么放在哪一列。
  • pdf 上的签名只是一个简单的字段,可以在 Acrobat 上拖放。至于它在 MySQL 数据库中的位置,只有一个签名列以及其他信息。在您看到插入 INTO mileage_form 的地方,应该插入签名字段。示例:INSERT INTO mileage_form (employee_name,mileage_rate, ... ,form_id,signature)VALUES ('$employee_name','$mileage_rate', ... ,'$form_id','$signature')";
  • 嗯,这告诉我 Acrobat 无法与您的代码通信,可能需要某种形式的权限集。我有点难以理解您想如何使用拖放选项,然后将其设置为变量。
  • 是的,我不确定您是否曾经在 acrobat 中创建过 PDF 表单,但是您可以使用一组不同的字段(即文本框、下拉菜单等),以及签名字段是这些选项之一。创建它时,将它拖到 PDF 表单上,然后保存。然后分发表格。创建签名字段时,我只是将其拖到表单上并保存。签名字段将始终存在,具有相同的名称和属性,一旦分发。
  • 您可以在这里查看pdf表格:

标签: php mysql pdf


【解决方案1】:

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

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

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

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

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

一些细节:

签名值在 HTML 表单格式提交中没有意义

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

(有关更多详细信息和深入介绍此内容的文档的指针,请参阅this answer.

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

因此,仅该签名对您没有任何价值,因为您没有原始签名的文档来验证签名。因此,任何人都可以简单地从其他文件中复制签名并将其发送出去,而您将没有机会识别欺诈行为。

解决方案 1:发送整个 PDF

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

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

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

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

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

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

使用这种技术,在手头的情况下,只转发主要由表单填写和签名组成的添加就足够了。

PDF submit-form 操作允许您提出此请求。参照。 IncludeAppendSaves 标志在 PDF 规范 ISO 32000-1 中的表 237 提交表单操作的标志中解释:

如果设置,提交的 FDF 文件应包括对基础 PDF 文档的所有增量更新的内容,如 FDF 字典中的 Differences 条目中包含的内容(参见表 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 表单格式提交的隐藏字段中获取签名。您只是无法验证它是否真的签署了表格。 ;)

【讨论】:

  • 你们有可以提取签名的pdf库吗?我找不到太多。另外,如果您不介意回答我的另一个问题(假设您对 pdf 内容了解很多)stackoverflow.com/questions/21843656/…
  • 我对 PHP 的了解并不深(Java、C#、... 是我专注的编程语言)。在关于 SO 的问题和答案中,我经常阅读 TCPDF 或 FPDF;不过,我不知道他们各自的重点,因此不能投票支持其中一个。如果这些库不允许显式访问签名,但至少允许对 PDF 对象结构进行低级别访问,您可以简单地使用该功能来跟踪对最终签名的引用并提取它..
猜你喜欢
  • 2018-02-09
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 2013-07-22
  • 2018-08-27
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
相关资源
最近更新 更多