PHP+MySQL实现可编辑PDF表单数据提取入库方案咨询
PHP实现可编辑PDF表单数据提取并存入MySQL的方案
嘿,我懂你现在的需求——用PHP和MySQL搭建一套系统,给指定用户提供可编辑PDF表单,还要把用户填的内容提取出来存到数据库里,而且你之前试了PDFtk没达到预期对吧?别慌,我给你几个实际项目里验证过的靠谱方案,分两种常见场景来给你讲:
场景1:用户上传已填写的可编辑PDF,PHP解析数据存库
这种场景适合需要用户线下填写PDF再上传的需求,推荐用setasign/FPDI系列库来处理,它能很好地解析PDF表单字段。
步骤1:安装依赖库
用Composer安装需要的包:
composer require setasign/fpdi setasign/fpdi-pdf-parser
步骤2:PHP解析上传的PDF并存储数据
下面是完整的示例代码,包含文件上传、PDF解析和数据库存储:
<?php require 'vendor/autoload.php'; use setasign\Fpdi\PdfParser\PdfParser; use setasign\Fpdi\PdfParser\StreamReader; // 处理用户上传的PDF文件 if ($_FILES['pdf_file']['error'] === UPLOAD_ERR_OK) { $pdfTempPath = $_FILES['pdf_file']['tmp_name']; // 读取并解析PDF $parser = new PdfParser(StreamReader::createByFile($pdfTempPath)); $pdfDocument = $parser->parse(); // 提取所有表单字段数据 $submittedData = []; foreach ($pdfDocument->getAcroForm()->getFields() as $field) { $fieldName = $field->getPartialName(); $fieldValue = $field->getValue(); $submittedData[$fieldName] = $fieldValue; } // 连接MySQL并存储数据 $dbHost = 'localhost'; $dbName = 'your_database_name'; $dbUser = 'your_db_user'; $dbPass = 'your_db_password'; try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 请根据你的数据库表结构调整字段和语句 $insertStmt = $pdo->prepare("INSERT INTO form_submissions (username, contact_email, form_content) VALUES (:username, :contact_email, :form_content)"); $insertStmt->execute([ ':username' => $submittedData['username'] ?? null, ':contact_email' => $submittedData['contact_email'] ?? null, ':form_content' => json_encode($submittedData) // 也可以把整个数据存为JSON ]); echo "表单数据已成功存入数据库!"; } catch(PDOException $e) { echo "数据库操作出错: " . $e->getMessage(); } } else { echo "PDF文件上传失败,请检查文件后重试!"; } ?>
注意事项
- 确保用户上传的是可编辑的AcroForm格式PDF,静态PDF无法提取字段数据
- 服务器需要给PHP足够的文件读写权限,允许上传和读取临时文件
- 要提前确认PDF里的表单字段名称,和你数据库字段对应上
场景2:在线填写PDF表单,直接提交数据到MySQL
这种场景体验更好,用户不用下载上传,直接在网页里填写PDF表单,然后通过AJAX提交数据。推荐用PDF.js来渲染PDF表单,配合PHP后端处理。
步骤1:前端渲染PDF并收集数据
先把PDF.js的核心文件(pdf.js和pdf.worker.js)放到你的项目目录里,然后用下面的HTML/JS代码渲染表单并收集用户输入:
<div class="pdf-container"> <canvas id="pdfRenderCanvas"></canvas> </div> <div class="form-controls"> <!-- 这里的输入框要和PDF里的表单字段一一对应 --> <input type="text" id="username" placeholder="用户名"> <input type="email" id="contact_email" placeholder="联系邮箱"> <button id="submitBtn">提交表单</button> </div> <script src="pdf.js"></script> <script src="pdf.worker.js"></script> <script> let pdfDoc = null; // 加载服务器上的可编辑PDF pdfjsLib.getDocument('path/to/your/editable_form.pdf').promise.then(function(doc) { pdfDoc = doc; return pdfDoc.getPage(1); // 假设表单在第一页 }).then(function(page) { const viewport = page.getViewport({scale: 1.2}); const canvas = document.getElementById('pdfRenderCanvas'); const ctx = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; // 渲染PDF页面 page.render({canvasContext: ctx, viewport: viewport}); }); // 提交数据到PHP后端 document.getElementById('submitBtn').addEventListener('click', function() { const formData = { username: document.getElementById('username').value, contact_email: document.getElementById('contact_email').value // 其他字段按需添加 }; fetch('submit_form.php', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(formData), }) .then(response => response.text()) .then(message => { alert(message); }) .catch(error => { console.error('提交出错:', error); }); }); </script>
步骤2:PHP后端接收并存储数据
创建submit_form.php文件,处理前端提交的JSON数据:
<?php $dbHost = 'localhost'; $dbName = 'your_database_name'; $dbUser = 'your_db_user'; $dbPass = 'your_db_password'; try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 读取前端提交的JSON数据 $submittedData = json_decode(file_get_contents('php://input'), true); // 插入数据库,根据你的表结构调整 $insertStmt = $pdo->prepare("INSERT INTO form_submissions (username, contact_email) VALUES (:username, :contact_email)"); $insertStmt->execute([ ':username' => $submittedData['username'] ?? null, ':contact_email' => $submittedData['contact_email'] ?? null ]); echo "表单提交成功!"; } catch(PDOException $e) { echo "数据库错误: " . $e->getMessage(); } ?>
补充:PDFtk的正确使用方式(如果想再试试)
如果你之前用PDFtk没成功,可能是没用到正确的命令。可以用PHP调用PDFtk的dump_data_fields命令来提取表单数据,适合服务器允许执行shell命令的场景:
<?php if ($_FILES['pdf_file']['error'] === UPLOAD_ERR_OK) { $pdfPath = $_FILES['pdf_file']['tmp_name']; // 调用PDFtk提取表单数据 $rawOutput = shell_exec("pdftk $pdfPath dump_data_fields"); // 解析PDFtk输出的内容 $formData = []; $lines = explode("\n", $rawOutput); $currentField = []; foreach ($lines as $line) { $trimmedLine = trim($line); if ($trimmedLine === '') { if (!empty($currentField)) { $fieldName = $currentField['FieldName'] ?? ''; $fieldValue = $currentField['FieldValue'] ?? ''; if ($fieldName) { $formData[$fieldName] = $fieldValue; } $currentField = []; } } else { list($key, $value) = explode(':', $trimmedLine, 2); $currentField[trim($key)] = trim($value); } } // 后续存储数据库的代码和前面一致 } ?>
注意事项
- 服务器必须安装PDFtk工具,并且PHP有执行shell命令的权限
- 要注意安全问题,避免用户上传恶意文件导致命令注入,建议对上传的PDF文件做校验
内容的提问来源于stack exchange,提问作者BLESSING
相关产品推荐
相关产品推荐

