我开发了一份我公司用来跟踪里程费用的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";
}
?>
答案 0 :(得分:0)
手头的PDF表格是以HTML表格格式提交的常规(即非XFA)PDF表格。
对于像这样提交的表单,提交签名字段的内容是没有意义的,因此没有完成。
因此,要访问签名信息,您必须更改表单以作为整体提交PDF(带填写字段)或使用IncludeAppendSaves作为FDF提交。
或者,您可以考虑仅签署表单数据的XFA表单和XFA签名。
无论如何,您都必须重写PDF和表单数据检索。
一些细节:
数字签名通常会签署一些字节数组。在集成PDF签名的情况下,此字节数组由整个PDF组成,仅排除为签名本身保留的范围:
(有关详细内容及更深入的文档指南,请参阅this answer.)
如果手边有文档,这些带符号的字节范围不仅包括原始PDF和表单填写,还包括新的PDF元数据和签名详细信息。通过HTML表单格式检索表单值时,您无权访问这些元数据:例如您不知道确切的修改日期时间或新生成的PDF文档标识符(存储在元数据中)。
因此,单独签名对您没有任何价值,因为您没有最初签名的文档来验证签名。因此,任何人都可以简单地从其他文档中复制签名并将其发送出去,而您将无法识别欺诈行为。
PDF 提交表单操作允许您请求发送整个PDF而不仅仅是表单字段值。参看表格237中的 SubmitPDF 标志在PDF规范ISO 32000-1中提交了提交表单操作标志:
如果设置,则文档应以PDF格式提交,使用MIME内容类型application / pdf(在Internet RFC 2045,多用途Internet邮件扩展(MIME),第一部分:Internet消息体格式中描述;参见参考书目)
当你获得整个PDF时,你可以使用普通的PDF库提取所有表格值,包括签名,你也可以验证签名(并积极地识别填写该表格的人)。
明显的缺点是传输的数据量。
PDF文件格式允许将文件的更改附加到其末尾,而无需更改原始文件内容:
使用这项技术,只需转发主要由表格填写和签名组成的附加内容就足够了。
PDF 提交表单操作允许您请求此操作。参看表格237中的 IncludeAppendSaves 标志在PDF规范ISO 32000-1中提交提交表单操作标志:
如果设置,提交的FDF文件应包括基础PDF文档的所有增量更新的内容,包含在FDF字典中的差异条目中(参见表243)。
在表243 FDF词典中的条目中,您甚至可以找到包含签名的提示:
这允许将任何数字签名(见12.8,“数字签名”)传输到服务器。
与解决方案1相比,这需要传输相当少量的数据。但是,传输的数据是FDF,格式与PDF类似但不完全相同。我不知道哪些库可用于FDF阅读。
另一种解决方案是从常规PDF表单切换到XFA(Adobe XML表单体系结构)表单。本质上,这使用XML作为格式来保存表单信息,并允许XML签名仅签署XML,而不是所有PDF。这可能会产生一种基于标准XML技术的带宽使用率相当低的解决方案。
我对XFA知之甚少,并且不能详细说明。
如果事实证明你无法访问发布的PDF或FDF数据(我不知道合作的PHP在这方面是怎样的),你也不是真的有兴趣验证签名而只是让一个人放入数据库,您可以尝试在PDF中使用JavaScript来深度复制签名域的内容,对其进行文本编码,并将其放入一些隐藏的文本字段中。
这样您就可以从HTML表单格式提交的隐藏字段中获取签名。您只是无法验证它是否实际签署了表单。 ;)