协助药品国际注册相关工作,包括环境搭建、PDF 扫描件解析、文档处理等。当用户需要进行药品国际注册、解析药品注册文档 PDF 扫描件、安装相关工具环境时使用。
核心原则:
保证质量是最高优先级,绝不允许分批处理导致质量下降!
具体要求:
逐页精心处理
质量标准
禁止行为
工作流程纪律
实现路径唯一性
今天研究的这套实现路径是唯一优先级:
PDF → 高清图像(300DPI+ 旋转校正)→ AI 图像识别 → 人工核对 → Word 文档 → 用户确认 → 下一页
这是唯一允许使用的路径,其他任何捷径都是禁止的!
违规后果:
本 Skill 用于支持药品国际注册工作流,主要功能包括:
python --version
# 或
python3 --version
Windows:
macOS:
brew install [email protected]
Linux:
sudo apt update
sudo apt install python3 python3-pip python3-venv
# 创建虚拟环境
python -m venv venv
# Windows 激活
venv\Scripts\activate
# macOS/Linux 激活
source venv/bin/activate
对于药品注册文档的 PDF 扫描件,推荐使用以下工具组合以获得最高精度:
# 基础 OCR 依赖
pip install pytesseract pdf2image pillow pdfplumber
# PaddleOCR(可选,建议等待官方修复 Bug)
pip install paddlepaddle paddleocr
# 图像处理增强
pip install opencv-python numpy
Windows:
macOS:
brew install tesseract tesseract-lang
Linux:
sudo apt install tesseract-ocr tesseract-ocr-chi-sim tesseract-ocr-chi-tra poppler-utils
import pdf2image
import pytesseract
from PIL import Image
import cv2
import numpy as np
import pdfplumber
import os
# 设置 Tesseract 路径(Windows)
if os.name == 'nt':
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
class PDFScannerParser:
"""高精度 PDF 扫描件解析器"""
def __init__(self, use_tesseract=True):
self.use_tesseract = use_tesseract
def preprocess_image(self, image):
"""图像预处理以提高 OCR 精度"""
img_array = np.array(image)
if len(img_array.shape) == 3:
gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY)
else:
gray = img_array
denoised = cv2.fastNlMeansDenoising(gray, None, 10, 7, 21)
binary = cv2.adaptiveThreshold(
denoised, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
sharpened = cv2.filter2D(binary, -1, kernel)
return Image.fromarray(sharpened)
def extract_text_tesseract(self, image, lang='chi_sim+eng'):
"""使用 Tesseract 提取文字"""
preprocessed = self.preprocess_image(image)
text = pytesseract.image_to_string(
preprocessed,
lang=lang,
config='--psm 6'
)
return text
def parse_pdf(self, pdf_path, dpi=300):
"""解析 PDF 扫描件"""
images = pdf2image.convert_from_path(pdf_path, dpi=dpi)
results = {
'file': pdf_path,
'total_pages': len(images),
'pages': []
}
for i, image in enumerate(images, 1):
print(f"正在处理第 {i}/{len(images)} 页...")
text = self.extract_text_tesseract(image)
results['pages'].append({
'page_number': i,
'text': text,
'word_count': len(text.split())
})
return results
# 使用示例
if __name__ == "__main__":
parser = PDFScannerParser(use_tesseract=True)
result = parser.parse_pdf("your_drug_document.pdf", dpi=300)
for page in result['pages']:
print(f"\n--- 第 {page['page_number']} 页 ---")
print(page['text'])
class DrugDocumentParser(PDFScannerParser):
"""药品注册文档专用解析器"""
def __init__(self):
super().__init__(use_tesseract=True)
# 药品注册常见关键词
self.drug_keywords = [
'药品名称', '通用名', '商品名', '化学名', '分子式',
'适应症', '规格', '剂型', '用法用量', '不良反应',
'禁忌', '注意事项', '药物相互作用', '贮藏',
'有效期', '批准文号', '生产企业', '生产地址'
]
def extract_drug_info(self, pdf_path):
"""提取药品关键信息"""
results = self.parse_pdf(pdf_path)
drug_info = {}
full_text = '\n'.join([p['text'] for p in results['pages']])
for keyword in self.drug_keywords[:5]:
if keyword in full_text:
idx = full_text.find(keyword)
if idx != -1:
segment = full_text[idx:idx+100]
drug_info[keyword] = segment.replace('\n', ' ')
return drug_info
保存以下脚本为 setup_env.py 并运行:
#!/usr/bin/env python3
"""药品国际注册环境安装脚本"""
import subprocess
import sys
def run_command(cmd, description):
print(f"\n[正在安装] {description}...")
try:
result = subprocess.run(cmd, shell=True, check=True, capture_output=True, text=True)
print(f"[OK] {description} 安装成功")
return True
except subprocess.CalledProcessError as e:
print(f"[FAIL] {description} 安装失败:{e}")
return False
def main():
print("=" * 60)
print("药品国际注册环境安装工具")
print("=" * 60)
packages = [
("pytesseract", "Tesseract Python 绑定"),
("pdf2image", "PDF 转图像工具"),
("pillow", "图像处理库"),
("pdfplumber", "PDF 文本提取"),
("opencv-python", "OpenCV 图像处理"),
("numpy", "数值计算库"),
]
success_count = 0
for pkg, desc in packages:
if run_command(f"{sys.executable} -m pip install {pkg}", desc):
success_count += 1
print(f"\nPython 包安装完成:{success_count}/{len(packages)}")
print("\n请确保已安装系统级 OCR 引擎:")
print("- Windows: Tesseract-OCR (含中文语言包)")
print("- macOS: brew install tesseract tesseract-lang")
print("- Linux: sudo apt install tesseract-ocr poppler-utils")
if __name__ == "__main__":
main()
运行安装脚本:
python setup_env.py
问题描述:
RuntimeError: [json.exception.parse_error.101] parse error at line 1, column 1:
attempting to parse an empty input
根本原因:
PP-LCNet_x1_0_doc_ori 的 inference.json 文件解析失败解决方案:
方案 A:使用 Tesseract OCR(⭐ 强烈推荐)
python scripts/pdf_scanner_parser.py document.pdf --tesseract -o output/
Tesseract OCR v5.4.0 优势:
C:\Program Files\Tesseract-OCR 安装完成方案 B:降级 PaddleOCR(不推荐,可能不兼容 Python 3.13+)
python -m pip uninstall paddleocr -y
python -m pip install "paddleocr>=2.7,<3.0"
解决方法:
验证 Tesseract 中文语言包:
"C:\Program Files\Tesseract-OCR\tesseract.exe" --list-langs
应显示:chi_sim, eng, osd
提高 DPI 到 400:
python scripts/pdf_scanner_parser.py document.pdf -d 400 -o output/
Windows 安装步骤:
Release-*.zipC:\popplerC:\poppler\bin 到系统 PATH| 场景 | 推荐引擎 | 理由 |
|---|---|---|
| 中文药品文档 | Tesseract | 稳定可靠,chi_sim 成熟 |
| 英文文档 | Tesseract | 速度快,精度高 |
| 表格提取 | pdfplumber | 专业处理表格 |
| 高精度需求 | Tesseract (400 DPI) | 高分辨率提升精度 |
lang='chi_sim+eng')将药品注册文档从中文翻译成英文,确保符合国际GMP(Good Manufacturing Practices)标准和FDA法规要求的专业术语。
翻译后必须强制检查术语准确性!
| 中文 | 推荐英文 | 备选英文 | 说明 |
|---|---|---|---|
| 批生产指令 | Batch Production Instruction (BPI) | Master Production Record (MPR) | BPI更具体,MPR是更高级别文件 |
| 批生产记录 | Batch Production Record (BPR) | Batch Manufacturing Record (BMR) | BPR和BMR可互换使用 |
| 主配方/工艺处方 | Master Formula | Master Batch Record | 指标准配方 |
| 领料单 | Material Requisition | Bill of Materials (BOM) | Material Requisition是流程单据,BOM是物料清单 |
| 内加物料 | Intragranular Materials | Intra-granular Excipients | 制粒前加入的物料 |
| 外加辅料 | Extragranular Materials | Extra-granular Excipients | 制粒后加入的物料 |
| 限额领料量 | Bill of Materials (BOM) | Allocated Material Quantity | BOM是标准术语 |
| 工艺过程 | Manufacturing Process | Production Process | Manufacturing更常用 |
| 理论产量 | Theoretical Yield | Expected Yield | 理论计算值 |
| 成品数量 | Actual Yield | Finished Quantity | 实际产出 |
| 装量差异 | Weight Variation | Fill Weight Tolerance | 胶囊/片剂重量差异 |
| 崩解时限 | Disintegration Time | Disintegration Limit | 固体制剂质量标准 |
| 三维混合机 | 3D Mixer | Three-Dimensional Mixer | 制药设备标准名称 |
| 胶囊充填 | Capsule Filling | Capsule Encapsulation | 制剂工序 |
| 干混 | Dry Blending | Dry Mixing | 混合工序 |
| QA | QA (Quality Assurance) | - | 质量保证 |
| 车间主任 | Workshop Director | Workshop Manager | 生产管理职位 |
def translate_drug_document(chinese_doc):
"""翻译药品文档并强制检查术语"""
# 步骤1:初步翻译
english_doc = translate_to_english(chinese_doc)
# 步骤2:强制术语检查(⭐ 必须执行)
terminology_checklist = {
'批生产指令': ['Batch Production Instruction', 'Batch Production Order'],
'批生产记录': ['Batch Production Record', 'Batch Manufacturing Record'],
'领料单': ['Material Requisition'],
'工艺处方': ['Master Formula'],
'内加物料': ['Intragranular Materials'],
'外加辅料': ['Extragranular Materials'],
'限额领料量': ['Bill of Materials'],
'工艺过程': ['Manufacturing Process'],
'理论产量': ['Theoretical Yield'],
'成品数量': ['Actual Yield'],
}
# 步骤3:验证每个术语
for cn_term, en_options in terminology_checklist.items():
if cn_term in chinese_doc:
# 检查英文文档是否使用了正确的术语
found_correct = False
for en_term in en_options:
if en_term in english_doc:
found_correct = True
break
if not found_correct:
print(f"⚠️ 术语错误:'{cn_term}' 未使用标准翻译")
print(f" 应使用:{en_options}")
# 自动修正
english_doc = auto_correct_term(english_doc, en_options)
# 步骤4:GMP合规性检查
gmp_compliance_check(english_doc)
return english_doc
def gmp_compliance_check(doc):
"""检查是否符合GMP法规要求"""
required_elements = [
'Batch No.',
'Production Date',
'Theoretical Yield',
'Actual Yield',
'Quality Standard',
'Manufacturing Process',
'Bill of Materials',
]
missing = []
for element in required_elements:
if element not in doc:
missing.append(element)
if missing:
print(f"⚠️ GMP合规性警告:缺少以下必需元素:{missing}")
return False
print("✅ GMP合规性检查通过")
return True
# 运行翻译脚本(包含强制术语检查)
python translate_drug_document.py input_chinese.docx -o output_english.docx
from docx import Document
import re
class DrugDocumentTranslator:
"""药品文档专业翻译器"""
def __init__(self):
# 标准术语库(基于GMP/FDA标准)
self.standard_terms = {
'批生产指令': 'Batch Production Instruction',
'批生产记录': 'Batch Production Record',
'领料单': 'Material Requisition',
'工艺处方': 'Master Formula',
'内加物料': 'Intragranular Materials',
'外加辅料': 'Extragranular Materials',
'限额领料量': 'Bill of Materials',
'工艺过程': 'Manufacturing Process',
'理论产量': 'Theoretical Yield',
'成品数量': 'Actual Yield',
'阿莫西林胶囊': 'Amoxicillin Capsules',
'立崩': 'Starch (Disintegrant)',
'硬脂酸镁': 'Magnesium Stearate',
'滑石粉': 'Talc',
'淀粉': 'Starch',
}
# 强制检查列表
self.mandatory_check = [
('批生产指令', ['Batch Production Instruction', 'Batch Production Order']),
('批生产记录', ['Batch Production Record', 'Batch Manufacturing Record']),
('领料单', ['Material Requisition']),
('工艺处方', ['Master Formula']),
('内加物料', ['Intragranular Materials']),
('外加辅料', ['Extragranular Materials']),
('工艺过程', ['Manufacturing Process']),
]
def translate(self, input_path, output_path):
"""翻译并强制检查"""
doc = Document(input_path)
# 翻译内容
translated_content = self._translate_content(doc)
# 强制术语检查
self._mandatory_terminology_check(translated_content)
# GMP合规性检查
self._gmp_check(translated_content)
# 保存
self._save_translation(translated_content, output_path)
print(f"✅ 翻译完成:{output_path}")
def _mandatory_terminology_check(self, content):
"""强制术语检查(⭐ 必须执行)"""
print("\n=== 术语准确性检查 ===")
errors = []
for cn_term, en_options in self.mandatory_check:
# 检查中文原文是否存在
if cn_term in content['chinese']:
# 检查英文翻译是否正确
found = False
for en_term in en_options:
if en_term in content['english']:
found = True
print(f"✅ '{cn_term}' → '{en_term}' ✓")
break
if not found:
error_msg = f"❌ '{cn_term}' 翻译错误,应使用:{en_options}"
errors.append(error_msg)
print(error_msg)
if errors:
print(f"\n⚠️ 发现 {len(errors)} 个术语错误,已自动修正")
self._auto_correct(content, errors)
else:
print("✅ 所有术语符合GMP标准")
def _gmp_check(self, content):
"""GMP合规性检查"""
print("\n=== GMP合规性检查 ===")
required_elements = [
'Batch No.',
'Production Date',
'Theoretical Yield',
'Actual Yield',
'Quality Standard',
'Manufacturing Process',
'Bill of Materials',
]
missing = []
for element in required_elements:
if element not in content['english']:
missing.append(element)
if missing:
print(f"⚠️ 缺少GMP必需元素:{missing}")
else:
print("✅ GMP合规性检查通过")
正确翻译:
关键术语:
正确翻译:
关键术语:
正确翻译:
关键术语:
| 错误翻译 | 正确翻译 | 原因 |
|---|---|---|
| Production Order | Batch Production Instruction | 药品行业使用Batch而非Order |
| Recipe | Master Formula | Formula是制药标准术语 |
| Process Flow | Manufacturing Process | Manufacturing更符合GMP |
| Output | Yield | Yield是制药收率标准术语 |
| Weight Difference | Weight Variation | Variation是药典标准术语 |
| Disintegration Limit | Disintegration Time | Time更准确描述测试项目 |
translate_drug_document.py - 药品文档翻译脚本(含强制检查)terminology_database.json - 医药领域标准术语库SKILL-3-Translation-Guide.md - 翻译指南详细文档将 PDF 扫描件转换为可编辑的 Word 文档(.docx),尽可能保持原文档的格式和布局。
# 运行转换脚本(自动处理目录中的第一个 PDF)
python pdf_to_word_test.py
# 或使用增强版(带图像预处理,识别率更高)
python enhanced_pdf_to_word.py
import fitz # PyMuPDF
import pytesseract
from docx import Document
from PIL import Image
# 设置 Tesseract 路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
# 打开 PDF 并转换为图像
doc = fitz.open('document.pdf')
page = doc[0]
mat = fitz.Matrix(400/72, 400/72) # 400 DPI
pix = page.get_pixmap(matrix=mat)
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
# OCR 识别
text = pytesseract.image_to_string(img, lang='chi_sim+eng', config='--psm 3')
# 创建 Word 文档
word_doc = Document()
word_doc.add_paragraph(text)
word_doc.save('output.docx')
doc.close()
对于扫描质量较差的文档:
import cv2
import numpy as np
def preprocess_image(img):
"""图像预处理以提升 OCR 识别率"""
img_array = np.array(img)
# 灰度转换
gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY) if len(img_array.shape) == 3 else img_array
# 去噪
denoised = cv2.fastNlMeansDenoising(gray, None, 30, 7, 21)
# 自适应二值化
binary = cv2.adaptiveThreshold(
denoised, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2
)
# 锐化
kernel = np.array([[-1,-1,-1], [-1,8,-1], [-1,-1,-1]])
sharpened = cv2.filter2D(binary, -1, kernel)
return Image.fromarray(sharpened)
# 使用预处理后的图像进行 OCR
enhanced_img = preprocess_image(original_img)
text = pytesseract.image_to_string(enhanced_img, lang='chi_sim+eng')
完整的使用说明、参数配置、最佳实践和常见问题解决方案请参阅:
pdf_to_word_test.py - 基础版本脚本enhanced_pdf_to_word.py - 增强版脚本(带图像预处理)SKILL-2-PDF-to-Word.md - 技能 #2 完整文档chi_sim+eng)