CoolFace
Apppublic

imran-decoder/filecrackhead1

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes
text_converter.py107 linesDownload Raw Back to services
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