跳轉到

案例研究:政府表單數位化

摘要:某縣市政府數位治理辦公室承擔 120 份紙本申請表單的數位化任務,面臨紙本表單 OCR 識別率低、互動式 PDF 不符合身心障礙者無障礙規定、後台人員仍需人工鍵入資料等三重挑戰。導入 NextPDF Pro 後,表單處理效率提升 85%,所有輸出通過 WCAG 2.2 Level AA 驗證,並達到台灣政府機關數位服務規範要求。


挑戰

現況痛點

該縣市政府在「數位政府 2025 行動計畫」框架下推動表單數位化,初期遇到三大技術障礙:

  1. 紙本表單 OCR 識別率不足:將掃描的紙本申請表(建築許可、社會福利申請、地籍查詢等)轉換為 PDF 後,OCR 識別率僅 72%,28% 的欄位資料需人工校正,實際上比繼續手工作業更耗時
  2. 無障礙合規強制要求:依據台灣《身心障礙者數位落差改善行動計畫》及《電子化政府推動方案》,政府機關提供的互動式 PDF 表單必須符合 WCAG 2.2 Level AA,現有表單均未通過驗證
  3. 資料孤島問題:市民填寫後的 PDF 表單回傳後,後台人員仍需人工鍵入數據系統,每份表單平均耗時 8 分鐘

技術約束

  • 政府系統使用 PHP 8.3 + CodeIgniter 4(需升級至 PHP 8.5)
  • 既有 120 份表單為 Word 或掃描 PDF,需轉換為標準 PDF/UA 格式
  • 後台業務系統為舊式 Oracle 資料庫,僅支援標準 CSV/JSON 匯入
  • 所有數位化表單需符合行政院數位部《電子表單設計規範》

解決方案

graph TD
    Paper["紙本/Word 表單\n(120 份)"] --> Converter["FormTemplateConverter\n範本標準化"]
    Converter --> WcagBuilder["無障礙表單建構器\nWCAG 2.2 AA 合規"]
    WcagBuilder --> Checker["WcagChecker\n自動驗證"]
    Checker --> |通過| Template["標準 PDF/UA 表單範本"]
    Checker --> |失敗| WcagBuilder
    Template --> Portal["政府服務入口網\n市民填寫下載"]
    Portal --> Submission["市民提交\n已填寫 PDF"]
    Submission --> Extractor["FormDataExtractor\n自動資料萃取"]
    Extractor --> Validator["FormDataValidator\n業務規則驗證"]
    Validator --> ETL["ETL 管線\n匯入業務系統"]
    ETL --> Oracle[(Oracle 資料庫)]

無障礙表單生成管線

use NextPDF\Pro\Document\ProDocument;
use NextPDF\Pro\Forms\AccessibleFormBuilder;
use NextPDF\Pro\Forms\AccessibleFormField;
use NextPDF\Pro\Forms\FieldType;
use NextPDF\Pro\Accessibility\WcagChecker;
use NextPDF\Pro\Accessibility\ComplianceTarget;
use NextPDF\Pro\Accessibility\ComplianceException;

final class GovernmentFormFactory
{
    public function __construct(
        private readonly WcagChecker $wcagChecker,
    ) {}

    /**
     * @throws ComplianceException 若表單未通過 WCAG 2.2 AA 驗證
     */
    public function createBuildingPermitForm(): string
    {
        $doc = ProDocument::createStandalone();

        // 設定文件語言、標題、結構(PDF/UA 必要條件)
        $doc->setLanguage('zh-TW');
        $doc->setTitle('建築許可申請表');
        $doc->setSubject('建築物使用執照申請');
        $doc->setAuthor('縣市政府建設局');
        $doc->setCreator('NextPDF Pro — Government Digital Forms');

        // 使用無障礙表單建構器
        $builder = new AccessibleFormBuilder($doc);

        // 申請人基本資料區塊
        $builder->addSection('申請人資料', level: 1);

        $builder->addField(
            AccessibleFormField::create(
                name: 'applicant_name',
                type: FieldType::Text,
                label: '申請人姓名',
                tooltip: '請填寫申請人身分證上的完整姓名',
                required: true,
                maxLength: 30,
            )
        );

        $builder->addField(
            AccessibleFormField::create(
                name: 'national_id',
                type: FieldType::Text,
                label: '身分證字號',
                tooltip: '格式:1 個英文字母 + 9 個數字,例如 A123456789',
                required: true,
                pattern: '^[A-Z][12][0-9]{8}$',
                errorMessage: '請輸入有效的身分證字號格式',
            )
        );

        $builder->addField(
            AccessibleFormField::create(
                name: 'applicant_type',
                type: FieldType::Radio,
                label: '申請人身分',
                required: true,
                options: [
                    'owner'       => '所有權人',
                    'agent'       => '代理人',
                    'contractor'  => '承造人',
                ],
            )
        );

        // 建築資訊區塊
        $builder->addSection('建築基地資料', level: 1);

        $builder->addField(
            AccessibleFormField::create(
                name: 'land_use_zone',
                type: FieldType::Dropdown,
                label: '使用分區',
                required: true,
                options: [
                    'residential_1' => '第一種住宅區',
                    'residential_2' => '第二種住宅區',
                    'commercial'    => '商業區',
                    'industrial'    => '工業區',
                    'conservation'  => '保護區',
                ],
            )
        );

        $builder->addField(
            AccessibleFormField::create(
                name: 'building_area',
                type: FieldType::Number,
                label: '申請建築面積(平方公尺)',
                required: true,
                minimum: 1,
                maximum: 99999,
                tooltip: '請填寫整數或最多兩位小數',
            )
        );

        // 附件聲明
        $builder->addField(
            AccessibleFormField::create(
                name: 'declaration',
                type: FieldType::Checkbox,
                label: '申請人聲明',
                required: true,
                checkboxText: '本申請人聲明上述填寫事項均屬實,如有不實,願負法律責任。',
            )
        );

        // 數位簽章欄位
        $builder->addSignatureField(
            name: 'applicant_signature',
            label: '申請人簽署',
            pageNumber: 2,
            x: 350.0, y: 700.0, width: 200.0, height: 60.0,
        );

        $pdfBytes = $doc->render();

        // 強制 WCAG 2.2 AA 驗證
        $report = $this->wcagChecker->check($pdfBytes);

        if (!$report->isCompliant()) {
            throw ComplianceException::fromReport(
                $report,
                message: sprintf(
                    'Building permit form failed WCAG 2.2 AA: %d errors',
                    $report->getErrorCount()
                ),
            );
        }

        return $pdfBytes;
    }
}

批次表單資料萃取

use NextPDF\Pro\Forms\FormDataExtractor;
use NextPDF\Pro\Forms\FormDataValidator;
use NextPDF\Pro\Forms\ValidationRule;

final class SubmissionProcessor
{
    public function __construct(
        private readonly FormDataExtractor $extractor,
        private readonly BusinessSystemClient $systemClient,
    ) {}

    /**
     * @param list<string> $submittedPdfPaths
     * @return BatchProcessResult
     */
    public function processBatch(array $submittedPdfPaths): BatchProcessResult
    {
        $validator = FormDataValidator::create()
            ->addRule('national_id', ValidationRule::regex('^[A-Z][12][0-9]{8}$'))
            ->addRule('building_area', ValidationRule::range(min: 1, max: 99999))
            ->addRule('applicant_name', ValidationRule::notEmpty())
            ->addRule('declaration', ValidationRule::equals('true'));

        $successful = 0;
        $failed = 0;
        $errors = [];

        foreach ($submittedPdfPaths as $pdfPath) {
            try {
                $pdf = file_get_contents($pdfPath);
                $formData = $this->extractor->extract($pdf);

                // 業務規則驗證
                $validationResult = $validator->validate($formData->toArray());
                if (!$validationResult->isValid()) {
                    throw new FormValidationException($validationResult->getErrors());
                }

                // 匯入業務系統(ETL)
                $this->systemClient->submitBuildingPermitApplication(
                    applicantName: $formData->getString('applicant_name'),
                    nationalId: $formData->getString('national_id'),
                    applicantType: $formData->getString('applicant_type'),
                    landUseZone: $formData->getString('land_use_zone'),
                    buildingArea: $formData->getFloat('building_area'),
                    submittedAt: new \DateTimeImmutable(),
                );

                $successful++;
            } catch (\Throwable $e) {
                $failed++;
                $errors[] = ['path' => $pdfPath, 'error' => $e->getMessage()];
            }
        }

        return new BatchProcessResult($successful, $failed, $errors);
    }
}

成果

指標 數位化前 導入後 改善幅度
表單處理時間(每份) 8 分鐘人工鍵入 1.2 分鐘(自動化) 85%
WCAG 2.2 AA 合規率 0%(未驗證) 100% 達標
OCR 識別錯誤率 28%(舊流程) 0%(原生欄位萃取) 100%
後台人員手動作業量 100% 手工 僅例外案例需人工介入(約 3%) 97%
表單提交至受理時間 2–3 個工作日 即時確認、同日受理 質的提升
無障礙投訴 每月平均 12 件 0 件(自服務上線後) 100%
數位化表單數量 0 份 120 份(全數完成) 目標達成

技術亮點

Tab 鍵順序自動化

WCAG 2.4.3 要求表單 Tab 鍵的移動順序必須與視覺閱讀順序一致:

// AccessibleFormBuilder 自動管理 Tab 索引
// 欄位按照加入順序(從上到下、從左到右)自動設定 TabOrder
$builder->setTabOrderMode('structure');  // 'structure' | 'row' | 'column' | 'unordered'

// 若需要自訂特定欄位的 Tab 順序
$builder->setExplicitTabOrder([
    'applicant_name',
    'national_id',
    'applicant_type',
    'contact_phone',
    'contact_email',
    'land_use_zone',
    'building_area',
    'declaration',
    'applicant_signature',
]);

多語言表單(繁中 / 英文)

// 生成雙語表單(政府服務新住民需求)
$builder->setLocale('zh-TW');
$builder->addAlternateLocale('en-US', translations: [
    'applicant_name' => 'Applicant Name',
    'national_id'    => 'National ID / ARC Number',
    // ...
]);

自動合規儀表板

// 定期掃描所有已發布表單,確保持續合規
$allForms = FormRepository::getPublishedForms();
$checker = new WcagChecker(target: ComplianceTarget::Wcag22AA);

$dashboard = [];
foreach ($allForms as $form) {
    $report = $checker->check($form->getPdfBytes());
    $dashboard[] = [
        'form_id'    => $form->getId(),
        'form_name'  => $form->getName(),
        'compliant'  => $report->isCompliant(),
        'errors'     => $report->getErrorCount(),
        'warnings'   => $report->getWarningCount(),
        'checked_at' => new \DateTimeImmutable(),
    ];
}

// 存入資料庫,驅動合規儀表板前端顯示

導入效益延伸

本專案成功後,縣市政府計畫在第二階段:

  1. 智慧表單:整合 HanXin Code 條碼,市民可用智慧型手機掃描條碼快速填入常用資訊
  2. 電子回執:表單受理後自動生成帶有 PAdES B-T 簽章的受理回執 PDF
  3. 跨機關流程:整合建設局、地政局、消防局的跨機關審查流程,統一文件格式

相關資源

Commercial License

This feature requires a commercial license. Contact our team for pricing and deployment support.

Contact Sales