在构建压缩数字档案馆系统之前,必须确保底层环境具备处理高并发文件流和复杂文档转换的能力。本系统基于 Linux 服务器(推荐 Ubuntu 20.04 LTS)搭建,核心工具采用 Python 3.8 进行编排,利用 Ghostscript 处理 PDF 压缩,ImageMagick 处理图像压缩。请依次执行以下命令完成基础环境初始化。
1. 更新系统源并安装基础工具
首先更新软件包列表并安装编译所需的依赖库,这是后续安装 Python 扩展库的基础。
```bash sudo apt-get update sudo apt-get install -y python3 python3-pip python3-venv build-essential ```2. 安装核心处理引擎 Ghostscript
Ghostscript 是处理 PDF 文件压缩和转换的核心组件,能将高扫描精度的 PDF 有效压缩至适合存储的大小。
```bash sudo apt-get install -y ghostscript ```3. 安装图像处理库 ImageMagick
用于处理 TIFF、JPEG 等档案图像的无损或有损压缩。
```bash sudo apt-get install -y imagemagick ```4. 配置 ImageMagick 策略(关键步骤)
默认情况下,ImageMagick 限制了 PDF 处理权限,必须修改配置文件 /etc/ImageMagick-6/policy.xml(版本不同可能是 ImageMagick-7),找到 domain="coder" rights="none" pattern="PDF" 这一行,将 rights="none" 修改为 rights="read|write",否则系统无法处理 PDF 文件。
```bash sudo sed -i 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/g' /etc/ImageMagick-6/policy.xml ```5. 创建 Python 虚拟环境并安装依赖库
为了隔离项目环境,推荐使用虚拟环境。安装 watchdog 用于监控文件夹变化,PyPDF2 用于处理 PDF 元数据。
```bash mkdir -p /data/compression_system cd /data/compression_system python3 -m venv venv source venv/bin/activate pip install watchdog PyPDF2 pillow ```清晰的目录结构是系统稳定运行的前提。请在 /data/compression_system 下执行以下命令创建标准工作目录。
```bash mkdir -p input_files output_files logs temp ```目录说明:
创建核心业务逻辑脚本 compressor_service.py。该脚本将包含 PDF 和图像的压缩逻辑,并自动监听 input_files 目录。请使用以下完整代码,无需修改即可直接运行。
```python import os import sys import time import shutil import logging import subprocess from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler from datetime import datetime 配置常量 INPUT_DIR = '/data/compression_system/input_files' OUTPUT_DIR = '/data/compression_system/output_files' TEMP_DIR = '/data/compression_system/temp' LOG_FILE = '/data/compression_system/logs/service.log' 配置日志 logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler(LOG_FILE), logging.StreamHandler(sys.stdout) ] ) logger = logging.getLogger(__name__) def compress_pdf(input_path, output_path): """ 使用 Ghostscript 压缩 PDF /ebook 设置适合屏幕阅读的质量,兼顾体积和清晰度 """ try: command = [ 'gs', '-sDEVICE=pdfwrite', '-dCompatibilityLevel=1.4', '-dPDFSETTINGS=/ebook', '-dNOPAUSE', '-dQUIET', '-dBATCH', f'-sOutputFile={output_path}', input_path ] subprocess.run(command, check=True) logger.info(f"PDF 压缩成功: {input_path} -> {output_path}") return True except subprocess.CalledProcessError as e: logger.error(f"PDF 压缩失败: {input_path}, 错误: {e}") return False def compress_image(input_path, output_path): """ 使用 ImageMagick convert 命令压缩图片 -quality 85 设置 JPEG 质量,-strip 移除元数据 """ try: command = [ 'convert', input_path, '-strip', '-interlace', 'Plane', '-quality', '85', output_path ] subprocess.run(command, check=True) logger.info(f"图片压缩成功: {input_path} -> {output_path}") return True except subprocess.CalledProcessError as e: logger.error(f"图片压缩失败: {input_path}, 错误: {e}") return False class CompressionHandler(FileSystemEventHandler): def on_created(self, event): if event.is_directory: return 等待文件写入完成(简单处理:等待1秒) time.sleep(1) input_path = event.src_path filename = os.path.basename(input_path) file_ext = filename.split('.')[-1].lower() 定义输出路径 output_path = os.path.join(OUTPUT_DIR, filename) 避免重复处理 if os.path.exists(output_path): logger.info(f"文件已存在,跳过: {filename}") return logger.info(f"检测到新文件: {filename}, 开始处理...") success = False if file_ext == 'pdf': success = compress_pdf(input_path, output_path) elif file_ext in ['jpg', 'jpeg', 'png', 'tif', 'tiff']: success = compress_image(input_path, output_path) else: logger.warning(f"不支持的文件格式: {file_ext}") return if success: 可选:处理完成后删除源文件或移动到备份目录 os.remove(input_path) logger.info(f"文件处理完成: {filename}") if __name__ == "__main__": event_handler = CompressionHandler() observer = Observer() observer.schedule(event_handler, INPUT_DIR, recursive=False) observer.start() logger.info(f"压缩数字档案馆系统已启动,监听目录: {INPUT_DIR}") try: while True: time.sleep(1) except KeyboardInterrupt: observer.stop() observer.join() ```为了确保系统能够在服务器重启后自动运行,并在崩溃后自动重启,需要将 Python 脚本注册为 Systemd 服务。创建服务配置文件 /etc/systemd/system/archiver_compressor.service。
1. 创建服务文件
```bash sudo nano /etc/systemd/system/archiver_compressor.service ```2. 写入以下配置内容
注意将 User 和 Group 替换为你当前系统的实际用户名,可通过 whoami 命令查看。
```ini [Unit] Description=Digital Archive Compression Service After=network.target [Service] User=root Group=root WorkingDirectory=/data/compression_system Environment="PATH=/data/compression_system/venv/bin" ExecStart=/data/compression_system/venv/bin/python /data/compression_system/compressor_service.py Restart=always RestartSec=10 [Install] WantedBy=multi-user.target ```
3. 启动并设置开机自启
执行以下命令重载 systemd 配置,启动服务并查看状态。
```bash sudo systemctl daemon-reload sudo systemctl enable archiver_compressor sudo systemctl start archiver_compressor sudo systemctl status archiver_compressor ```如果状态显示为 active (running),说明服务已成功启动。如果出现错误,请使用 journalctl -u archiver_compressor -f 查看实时日志排查问题。
系统部署完成后,必须进行实际测试以验证压缩效果和稳定性。
1. 准备测试文件
找一份大于 5MB 的 PDF 扫描件或高分辨率 TIFF 图片,命名为 test_source.pdf 或 test_source.jpg。
2. 投放文件
将测试文件复制到 /data/compression_system/input_files 目录。
```bash cp /path/to/your/test_source.pdf /data/compression_system/input_files/ ```3. 观察处理结果
查看日志输出,确认系统是否检测到文件并开始处理。
```bash tail -f /data/compression_system/logs/service.log ```日志中应显示“检测到新文件”、“开始处理”以及“压缩成功”的字样。
4. 验证压缩效果
处理完成后,检查 output_files 目录,对比原始文件和生成文件的大小。
```bash ls -lh /data/compression_system/output_files/ ```通常情况下,使用 /ebook 预设的 PDF 压缩率能达到 30%-50%,图片压缩率能达到 50%-70%。
在实操过程中,可能会遇到以下两个典型问题,请参考对应方案解决。
1. 提示 "gs: command not found"
这说明 Ghostscript 未正确安装或未加入环境变量。请重新执行第二步安装命令,并检查 /usr/bin/gs 是否存在。
2. 提示 "attempt to perform operation not allowed by security policy"
这是 ImageMagick 的安全策略限制。请务必按照第一步中的第 4 点,修改 policy.xml 文件,将 PDF 的权限从 none 改为 read|write,修改后需要重启 Systemd 服务。
```bash sudo systemctl restart archiver_compressor ```