imran-decoder/filecrackhead1
0
1"""2Text & Markup Converter: TXT/HTML/Markdown ↔ PDF/DOCX3Uses pandoc via pypandoc for all conversions.4"""5 6import subprocess7from pathlib import Path8 9import pypandoc10 11from app.config import get_settings12from app.utils.logging_utils import get_logger13 14logger = get_logger(__name__)15settings = get_settings()16 17 18def _pandoc_convert(19 input_path: Path,20 output_path: Path,21 input_format: str,22 output_format: str,23 extra_args: list[str] | None = None,24) -> Path:25 """Run pandoc conversion via pypandoc."""26 args = extra_args or []27 try:28 try:29 pypandoc.convert_file(30 str(input_path),31 output_format,32 format=input_format,33 outputfile=str(output_path),34 extra_args=args,35 )36 except OSError as exc:37 if "No pandoc was found" in str(exc):38 logger.warning("Pandoc not found locally. Downloading via pypandoc...")39 pypandoc.download_pandoc()40 pypandoc.convert_file(41 str(input_path),42 output_format,43 format=input_format,44 outputfile=str(output_path),45 extra_args=args,46 )47 else:48 raise49 except Exception as exc:50 raise RuntimeError(f"Pandoc conversion failed: {exc}") from exc51 52 if not output_path.exists():53 raise RuntimeError(f"Pandoc did not produce output file at {output_path}")54 return output_path55 56 57# ---------------------------------------------------------------------------58# TXT conversions59# ---------------------------------------------------------------------------60 61def txt_to_pdf(input_path: Path, output_path: Path, work_dir: Path, **kwargs) -> Path:62 from app.services.word_converter import docx_to_pdf63 temp_docx = work_dir / f"{input_path.stem}_temp.docx"64 txt_to_docx(input_path, temp_docx, **kwargs)65 return docx_to_pdf(temp_docx, output_path, work_dir, **kwargs)66 67 68def txt_to_docx(input_path: Path, output_path: Path, **_) -> Path:69 return _pandoc_convert(input_path, output_path, "markdown", "docx")70 71 72# ---------------------------------------------------------------------------73# HTML conversions74# ---------------------------------------------------------------------------75 76def html_to_pdf(input_path: Path, output_path: Path, work_dir: Path, **kwargs) -> Path:77 from app.services.word_converter import docx_to_pdf78 temp_docx = work_dir / f"{input_path.stem}_temp.docx"79 html_to_docx(input_path, temp_docx, **kwargs)80 return docx_to_pdf(temp_docx, output_path, work_dir, **kwargs)81 82 83def html_to_docx(input_path: Path, output_path: Path, **_) -> Path:84 return _pandoc_convert(input_path, output_path, "html", "docx")85 86 87# ---------------------------------------------------------------------------88# Markdown conversions89# ---------------------------------------------------------------------------90 91def md_to_pdf(input_path: Path, output_path: Path, work_dir: Path, **kwargs) -> Path:92 from app.services.word_converter import docx_to_pdf93 temp_docx = work_dir / f"{input_path.stem}_temp.docx"94 md_to_docx(input_path, temp_docx, **kwargs)95 return docx_to_pdf(temp_docx, output_path, work_dir, **kwargs)96 97 98def md_to_docx(input_path: Path, output_path: Path, **_) -> Path:99 return _pandoc_convert(input_path, output_path, "markdown", "docx")100 101 102# ---------------------------------------------------------------------------103# Reverse: PDF/DOCX → TXT/HTML/MD (via pandoc for DOCX, PyMuPDF for PDF)104# These are handled by pdf_converter.py and word_converter.py respectively.105# Documented here for reference only.106# ---------------------------------------------------------------------------107 