Archived
feat: pdf reader
This commit is contained in:
@@ -89,7 +89,69 @@ def _process_epub(file_path: str) -> dict[str, Any]:
|
||||
|
||||
|
||||
def _process_pdf(file_path: str) -> dict[str, Any]:
|
||||
return {"format": "pdf", "page_count": 0, "metadata": {}, "toc": []}
|
||||
from pypdf import PdfReader
|
||||
|
||||
reader = PdfReader(file_path)
|
||||
page_count = len(reader.pages)
|
||||
metadata = _extract_pdf_metadata(reader)
|
||||
toc = _extract_pdf_outline(reader)
|
||||
if not toc and page_count > 0:
|
||||
toc = [
|
||||
{"title": f"Page {i}", "href": f"pdf:page:{i}", "children": []}
|
||||
for i in range(1, page_count + 1)
|
||||
]
|
||||
return {
|
||||
"format": "pdf",
|
||||
"page_count": page_count,
|
||||
"metadata": metadata,
|
||||
"toc": toc,
|
||||
}
|
||||
|
||||
|
||||
def _extract_pdf_metadata(reader) -> dict[str, Any]:
|
||||
metadata: dict[str, Any] = {}
|
||||
info = reader.metadata
|
||||
if not info:
|
||||
return metadata
|
||||
title = getattr(info, "title", None)
|
||||
author = getattr(info, "author", None)
|
||||
if title:
|
||||
metadata["title"] = str(title)
|
||||
if author:
|
||||
metadata["author"] = str(author)
|
||||
return metadata
|
||||
|
||||
|
||||
def _extract_pdf_outline(reader) -> list[dict[str, Any]]:
|
||||
outline = getattr(reader, "outline", None)
|
||||
if not outline:
|
||||
return []
|
||||
return _walk_pdf_outline(reader, outline)
|
||||
|
||||
|
||||
def _walk_pdf_outline(reader, outline: list[Any]) -> list[dict[str, Any]]:
|
||||
entries: list[dict[str, Any]] = []
|
||||
i = 0
|
||||
while i < len(outline):
|
||||
item = outline[i]
|
||||
if isinstance(item, list):
|
||||
if entries:
|
||||
entries[-1]["children"] = _walk_pdf_outline(reader, item)
|
||||
i += 1
|
||||
continue
|
||||
title = getattr(item, "title", None) or "Section"
|
||||
page_num = 1
|
||||
try:
|
||||
page_num = reader.get_destination_page_number(item) + 1
|
||||
except Exception:
|
||||
logger.debug("Could not resolve PDF outline destination", exc_info=True)
|
||||
entries.append({
|
||||
"title": str(title),
|
||||
"href": f"pdf:page:{page_num}",
|
||||
"children": [],
|
||||
})
|
||||
i += 1
|
||||
return entries
|
||||
|
||||
|
||||
def _extract_epub_metadata(book) -> dict[str, Any]:
|
||||
|
||||
Reference in New Issue
Block a user