Initial commit of Roster
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
import pathlib
|
||||
import shutil
|
||||
import subprocess
|
||||
from io import BufferedReader, BytesIO
|
||||
from typing import Literal, Optional, Union
|
||||
|
||||
T_repair_setting = Literal["default", "prepress", "printer", "ebook", "screen"]
|
||||
|
||||
|
||||
def _repair(
|
||||
path_or_fp: Union[str, pathlib.Path, BufferedReader, BytesIO],
|
||||
password: Optional[str] = None,
|
||||
gs_path: Optional[Union[str, pathlib.Path]] = None,
|
||||
setting: T_repair_setting = "default",
|
||||
) -> BytesIO:
|
||||
|
||||
executable = (
|
||||
gs_path
|
||||
or shutil.which("gs")
|
||||
or shutil.which("gswin32c")
|
||||
or shutil.which("gswin64c")
|
||||
)
|
||||
if executable is None: # pragma: nocover
|
||||
raise Exception(
|
||||
"Cannot find Ghostscript, which is required for repairs.\n"
|
||||
"Visit https://www.ghostscript.com/ for installation instructions."
|
||||
)
|
||||
|
||||
repair_args = [
|
||||
executable,
|
||||
"-sstdout=%stderr",
|
||||
"-o",
|
||||
"-",
|
||||
"-sDEVICE=pdfwrite",
|
||||
f"-dPDFSETTINGS=/{setting}",
|
||||
]
|
||||
|
||||
if password:
|
||||
repair_args += [f"-sPDFPassword={password}"]
|
||||
|
||||
if isinstance(path_or_fp, (str, pathlib.Path)):
|
||||
stdin = None
|
||||
repair_args += [str(pathlib.Path(path_or_fp).absolute())]
|
||||
else:
|
||||
stdin = path_or_fp
|
||||
repair_args += ["-"]
|
||||
|
||||
proc = subprocess.Popen(
|
||||
repair_args,
|
||||
stdin=subprocess.PIPE if stdin else None,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
)
|
||||
|
||||
stdout, stderr = proc.communicate(stdin.read() if stdin else None)
|
||||
|
||||
if proc.returncode:
|
||||
raise Exception(f"{stderr.decode('utf-8')}")
|
||||
|
||||
return BytesIO(stdout)
|
||||
|
||||
|
||||
def repair(
|
||||
path_or_fp: Union[str, pathlib.Path, BufferedReader, BytesIO],
|
||||
outfile: Optional[Union[str, pathlib.Path]] = None,
|
||||
password: Optional[str] = None,
|
||||
gs_path: Optional[Union[str, pathlib.Path]] = None,
|
||||
setting: T_repair_setting = "default",
|
||||
) -> Optional[BytesIO]:
|
||||
repaired = _repair(path_or_fp, password, gs_path=gs_path, setting=setting)
|
||||
if outfile:
|
||||
with open(outfile, "wb") as f:
|
||||
f.write(repaired.read())
|
||||
return None
|
||||
else:
|
||||
return repaired
|
||||
Reference in New Issue
Block a user