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

如何程序化识别PDF中复选框的勾选状态?

编程判断PDF中复选框是否勾选的解决方案

针对PDF中的复选框,需分原生表单复选框和扫描版图像复选框两种场景处理,以下是具体实现方案:

一、原生PDF表单(非扫描件)

这类复选框是PDF内置的表单元素,无需OCR,直接通过PDF解析库读取状态即可:

  • Python 实现(使用pdfplumber):
    import pdfplumber
    
    with pdfplumber.open("target.pdf") as pdf:
        for page in pdf.pages:
            form_fields = page.extract_form_fields()
            for field in form_fields:
                if field.get("type") == "checkbox":
                    print(f"复选框名称: {field['name']}, 勾选状态: {'已勾选' if field['checked'] else '未勾选'}")
    
  • Java 实现(使用Apache PDFBox):
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
    import org.apache.pdfbox.pdmodel.interactive.form.PDCheckbox;
    import org.apache.pdfbox.pdmodel.interactive.form.PDField;
    
    import java.io.File;
    import java.util.Map;
    
    public class CheckboxReader {
        public static void main(String[] args) throws Exception {
            PDDocument document = PDDocument.load(new File("target.pdf"));
            PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm();
            
            if (acroForm != null) {
                Map<String, PDField> fields = acroForm.getFields();
                for (PDField field : fields.values()) {
                    if (field instanceof PDCheckbox) {
                        PDCheckbox checkbox = (PDCheckbox) field;
                        String status = checkbox.isChecked() ? "已勾选" : "未勾选";
                        System.out.printf("复选框名称: %s, 勾选状态: %s%n", field.getFullyQualifiedName(), status);
                    }
                }
            }
            document.close();
        }
    }
    

二、扫描版PDF(图像型复选框)

扫描版PDF本质是图像集合,需先提取页面图像,再针对复选框区域做图像分析:

1. 定位复选框区域

  • 若复选框位置固定,可直接预设坐标范围;
  • 若位置不固定,先用Tesseract/Google Cloud Vision API识别文本,通过文本位置反推复选框坐标。

2. 图像分析判断状态

针对你提供的三种复选框样式,推荐两种高效方法:

像素统计法

通过统计复选框区域内深色像素占比判断状态:

import cv2
import numpy as np

def check_checkbox_status(image_path, x, y, w, h):
    # 读取灰度图
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    # 截取复选框区域
    roi = img[y:y+h, x:x+w]
    # 二值化:将背景转为白色,勾选标记转为黑色
    _, binary_img = cv2.threshold(roi, 200, 255, cv2.THRESH_BINARY_INV)
    # 统计黑色像素数量
    black_pixel_count = np.sum(binary_img == 255)
    # 占比超过10%则判定为已勾选(阈值可根据实际调整)
    return black_pixel_count > (w * h * 0.1)

模板匹配法

提前准备已勾选/未勾选的模板图,通过模板匹配度判断状态:

import cv2

def match_checkbox_template(image_path, template_path):
    img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    template = cv2.imread(template_path, cv2.IMREAD_GRAYSCALE)
    # 执行模板匹配
    match_result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
    # 匹配度超过0.8则判定为匹配成功
    return np.max(match_result) > 0.8

# 使用示例
is_checked = match_checkbox_template("checkbox_area.png", "checked_template.png")

3. 优化OCR方案

你之前使用的Google Cloud Vision API,可切换至Document AI表单解析器,它专门针对表单场景优化,能直接识别复选框的勾选状态,比通用OCR精准度更高。

三、混合类型PDF处理

若PDF同时包含原生表单页和扫描页,可先通过PDF解析库判断页面类型:

  • 检查页面是否存在表单元素,存在则按原生表单处理;
  • 若页面仅包含图像,则按扫描版PDF处理。

内容的提问来源于stack exchange,提问作者Saumini Navaratnam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.11 22:45:56