案例研究:政府表單數位化¶
摘要:某縣市政府數位治理辦公室承擔 120 份紙本申請表單的數位化任務,面臨紙本表單 OCR 識別率低、互動式 PDF 不符合身心障礙者無障礙規定、後台人員仍需人工鍵入資料等三重挑戰。導入 NextPDF Pro 後,表單處理效率提升 85%,所有輸出通過 WCAG 2.2 Level AA 驗證,並達到台灣政府機關數位服務規範要求。
挑戰¶
現況痛點¶
該縣市政府在「數位政府 2025 行動計畫」框架下推動表單數位化,初期遇到三大技術障礙:
- 紙本表單 OCR 識別率不足:將掃描的紙本申請表(建築許可、社會福利申請、地籍查詢等)轉換為 PDF 後,OCR 識別率僅 72%,28% 的欄位資料需人工校正,實際上比繼續手工作業更耗時
- 無障礙合規強制要求:依據台灣《身心障礙者數位落差改善行動計畫》及《電子化政府推動方案》,政府機關提供的互動式 PDF 表單必須符合 WCAG 2.2 Level AA,現有表單均未通過驗證
- 資料孤島問題:市民填寫後的 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(),
];
}
// 存入資料庫,驅動合規儀表板前端顯示
導入效益延伸¶
本專案成功後,縣市政府計畫在第二階段:
- 智慧表單:整合 HanXin Code 條碼,市民可用智慧型手機掃描條碼快速填入常用資訊
- 電子回執:表單受理後自動生成帶有 PAdES B-T 簽章的受理回執 PDF
- 跨機關流程:整合建設局、地政局、消防局的跨機關審查流程,統一文件格式
相關資源¶
- WCAG / PDF-UA 無障礙合規檢查器
- 進階表單處理
- 特殊條碼格式 — HanXin Code 應用
- PII 遮蔽 — 表單個資合規
- FormDataExtractor API 參考
Commercial License
This feature requires a commercial license. Contact our team for pricing and deployment support.
Contact Sales