You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:12:43