Files
Enterprise-Knowledge-Base/docreader/parser/markitdown_parser.py
T

47 lines
1.6 KiB
Python

import io
import logging
from markitdown import MarkItDown
from docreader.models.document import Document
from docreader.parser.base_parser import BaseParser
from docreader.parser.chain_parser import PipelineParser
from docreader.parser.markdown_parser import MarkdownParser
logger = logging.getLogger(__name__)
class StdMarkitdownParser(BaseParser):
"""
PDF Document Parser
This parser handles PDF documents by extracting text content.
It uses the markitdown library for simple text extraction.
"""
def __init__(self, *args, **kwargs):
self.markitdown = MarkItDown()
def parse_into_text(self, content: bytes, file_extension: str = None) -> Document:
"""
Modified to support explicit file_extension to fix Issue #544.
If file_extension is not provided, we try to infer it or default to None.
"""
try:
# 核心修复点:传入 file_extension 参数
# 如果调用方没传,markitdown 可能会报错,这里我们至少保证它有尝试的机会
result = self.markitdown.convert(
io.BytesIO(content),
file_extension=file_extension,
keep_data_uris=True
)
return Document(content=result.text_content)
except Exception as e:
logger.warning(f"Markitdown conversion failed: {e}. Fallback might be triggered.")
# 必须抛出异常,这样外部的 FirstParser 才会切换到 DocxParser 这种备选方案
raise e
class MarkitdownParser(PipelineParser):
_parser_cls = (StdMarkitdownParser, MarkdownParser)