agentic_huge_data_base / wiki
页面 Paperless-ngx · 6 批量操作·DeepWiki 中文全文译文

6 · 批量操作(Bulk Operations)

文档归档与消费管道 · 聚焦本章的模块关系、源码依据与实现要点。

项目Paperless-ngx 章节6 状态全文译文 模块文档对象与元数据、界面与交互、系统架构、测试、发布与运维
源码线索
  • docs/api.md
  • src-ui/src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.html
  • src-ui/src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.spec.ts
  • src-ui/src/app/components/common/confirm-dialog/merge-confirm-dialog/merge-confirm-dialog.component.ts
  • src-ui/src/app/components/common/confirm-dialog/rotate-confirm-dialog/rotate-confirm-dialog.component.spec.ts
  • src/documents/bulk_edit.py
  • src/documents/tests/test_api_bulk_edit.py
  • src/documents/tests/test_bulk_edit.py
模块标签
  • 文档对象与元数据
  • 界面与交互
  • 系统架构
  • 测试、发布与运维
  • 存储与持久化

章节正文

批量操作

批量操作

相关源文件

本章引用的主要源码文件:

  • src-ui/e2e/document-list/document-list.spec.ts
  • src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html
  • src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts
  • src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts
  • src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.html
  • src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.scss
  • src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.spec.ts
  • src-ui/src/app/components/common/filterable-dropdown/toggleable-dropdown-button/toggleable-dropdown-button.component.ts
  • src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.html
  • src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.spec.ts
  • src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts
  • src-ui/src/app/components/document-list/filter-editor/filter-editor.component.html
  • src-ui/src/app/components/document-list/filter-editor/filter-editor.component.scss
  • src-ui/src/app/components/document-list/filter-editor/filter-editor.component.spec.ts
  • src-ui/src/app/components/document-list/filter-editor/filter-editor.component.ts
  • src-ui/src/app/data/filter-rule-type.ts
  • src-ui/src/app/pipes/filter.pipe.spec.ts
  • src-ui/src/app/pipes/filter.pipe.ts
  • src/documents/barcodes.py
  • src/documents/bulk_edit.py
  • src/documents/data_models.py
  • src/documents/filters.py
  • src/documents/serialisers.py
  • src/documents/tests/test_api_bulk_edit.py
  • src/documents/tests/test_api_custom_fields.py
  • src/documents/tests/test_api_documents.py
  • src/documents/tests/test_api_filter_by_custom_fields.py
  • src/documents/tests/test_barcodes.py
  • src/documents/tests/test_bulk_edit.py
  • src/documents/tests/utils.py
  • src/documents/views.py
  • src/paperless/urls.py

本文档介绍了 Paperless-ngx 中的批量操作系统,该系统允许用户同时对多个文档执行各种操作。该功能可通过用户界面和 REST API 两种方式使用。

概述

Paperless-ngx 提供了一套全面的批量操作功能,可以高效管理文档集合。这些操作包括元数据编辑、标签管理、文档处理、PDF 操作和权限管理。

Paperless-ngx · 概述 · 图 1
Paperless-ngx · 概述 · 图 1

来源:src/documents/views.py:108-108, src/documents/bulk_edit.py:1-40, src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts:80-83

支持的操作

批量操作在 src/documents/bulk_edit.py 中实现为专用函数,可以高效处理多个文档。

元数据操作
操作描述参数实现
set_correspondent为多个文档设置通信方correspondent:ID 或 nullsrc/documents/bulk_edit.py:111-131
set_document_type为多个文档设置文档类型document_type:ID 或 nullsrc/documents/bulk_edit.py:156-173
set_storage_path为多个文档设置存储路径storage_path:ID 或 nullsrc/documents/bulk_edit.py:134-153

元数据更新使用 Django 的 .update() 方法以提高效率,然后触发 bulk_update_documents.apply_async 来刷新搜索索引和元数据缓存 src/documents/bulk_edit.py:126-129

标签操作
操作描述参数实现
add_tag为多个文档添加标签tag:标签 IDsrc/documents/bulk_edit.py:176-202
remove_tag从多个文档中移除标签tag:标签 IDsrc/documents/bulk_edit.py:205-221
modify_tags在一次操作中添加和移除标签add_tags:列表,remove_tags:列表src/documents/bulk_edit.py:224-239

add_tag 操作具有层级性;它会自动将所选标签的所有祖先标签添加到目标文档中 src/documents/bulk_edit.py:178-178

自定义字段和权限操作
操作描述参数实现
modify_custom_fields添加/更新和移除自定义字段add_custom_fieldsremove_custom_fieldssrc/documents/bulk_edit.py:242-307
set_permissions设置所有者和对象级权限set_permissionsownermergesrc/documents/bulk_edit.py:382-411

自定义字段操作会处理文档链接字段的对称性,确保如果文档 A 链接到文档 B,则文档 B 也会更新以链接回文档 A src/documents/bulk_edit.py:292-302

PDF 操作

系统提供了多个强大的 PDF 操作功能,使用 pikepdf 库实现:

操作描述参数实现
rotate以 90 度为增量旋转 PDF 文档degrees:(90, 180, 270)src/documents/bulk_edit.py:414-444
merge将多个 PDF 合并为一个新文档metadata_document_iddelete_originalssrc/documents/bulk_edit.py:447-508
split根据页面范围将 PDF 拆分为多个文档pages:范围列表src/documents/bulk_edit.py:511-576
delete_pages从 PDF 文档中删除特定页面pages:整数列表src/documents/bulk_edit.py:579-605
Paperless-ngx · PDF 操作 · 图 2
Paperless-ngx · PDF 操作 · 图 2

来源:src/documents/bulk_edit.py:414-605

接口

批量操作通过 BulkEditView 进行管理。

端点:POST /api/文档/bulk_edit/

此端点期望一个 JSON 载荷,包含文档 ID、方法名称以及方法特定的参数。

示例:合并文档

{
  "documents": [10, 11, 12],
  "method": "merge",
  "parameters": {
    "metadata_document_id": 10,
    "delete_originals": true
  }
}
批量下载

BulkDownloadView 负责为多个文档生成 ZIP 归档文件。它支持不同的策略:

  • OriginalsOnlyStrategy:仅包含原始上传文件。
  • ArchiveOnlyStrategy:仅包含 OCR 处理后的归档 PDF 版本。
  • OriginalAndArchiveStrategy:ZIP 中包含两个版本。

来源:src/documents/views.py:109-111, src/paperless/urls.py:151-154

前端实现

批量操作的前端逻辑集中在 BulkEditorComponent 中。

BulkEditorComponent

该组件管理 DocumentListComponent 中文档的选择状态,并提供触发操作的界面。

  • 权限检查:它会检查 userCanEditAlluserOwnsAll 以启用或禁用特定的批量操作 src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts:129-151
  • 选择模型:它使用 FilterableDropdownSelectionModel 来处理标签、通信方和文档类型,以便在批量编辑时支持多选过滤 src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts:99-103
FilterableDropdownComponent

一个可复用的组件,批量编辑器使用它来显示元数据列表(标签等),并支持搜索和选择功能。

  • 逻辑:它支持"包含"和"排除"交集用于过滤 src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts:52-55
  • 虚拟滚动:使用 cdk-virtual-scroll-viewport 来高效处理大量标签或通信方 src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.html:36-36

来源:src-ui/src/app/components/document-list/bulk-editor/bulk-editor.component.ts:1-110, src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts:1-60

条码驱动的批量操作

Paperless-ngx 通过 BarcodePlugin 支持在消费阶段进行批量操作。这允许根据物理条码自动拆分文档或添加标签。

文档拆分

如果启用了 CONSUMER_ENABLE_BARCODE_SPLITBarcodePlugin 会检测"分隔符"条码。当检测到时,它会为原始文件的每个结果片段触发 tasks.consume_file 任务 src/documents/barcodes.py:183-210

ASN 和标签分配
  • ASN:检测与配置的 ASN 前缀匹配的条码,并将其分配给 archive_serial_number 字段 src/documents/barcodes.py:60-65
  • 标签:将条码值与 BARCODE_TAG_MAPPING 进行匹配,以自动为文档应用标签 src/documents/barcodes.py:68-80

来源:src/documents/barcodes.py:41-80, src/documents/barcodes.py:183-215