Files
adaptronic_label-printer/prepare_ghostscript.py

116 lines
3.5 KiB
Python

"""
prepare_ghostscript.py
Finds the system GhostScript installation and copies the files needed for
bundling into conf/ghostscript/
Files copied:
conf/ghostscript/bin/gswin64c.exe (or gswin32c.exe)
conf/ghostscript/bin/gsdll64.dll (or gsdll32.dll)
conf/ghostscript/lib/*.ps (PostScript init files)
Run this ONCE before building the exe with build_windows.bat.
"""
import os
import shutil
import glob
import sys
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
DEST_BIN = os.path.join(SCRIPT_DIR, "conf", "ghostscript", "bin")
DEST_LIB = os.path.join(SCRIPT_DIR, "conf", "ghostscript", "lib")
SEARCH_ROOTS = [
os.environ.get("ProgramFiles", r"C:\Program Files"),
os.environ.get("ProgramFiles(x86)", r"C:\Program Files (x86)"),
os.environ.get("ProgramW6432", r"C:\Program Files"),
]
FLAVOURS = [
("gswin64c.exe", "gsdll64.dll"),
("gswin32c.exe", "gsdll32.dll"),
]
print()
print("=" * 60)
print(" GhostScript Bundle Preparation")
print("=" * 60)
print()
def find_ghostscript():
"""Return (bin_dir, lib_dir, exe_name, dll_name) or None."""
for root in dict.fromkeys(r for r in SEARCH_ROOTS if r): # unique, preserve order
gs_root = os.path.join(root, "gs")
if not os.path.isdir(gs_root):
continue
# Each versioned sub-folder, newest first
versions = sorted(
[d for d in glob.glob(os.path.join(gs_root, "gs*")) if os.path.isdir(d)],
reverse=True,
)
for ver_dir in versions:
bin_dir = os.path.join(ver_dir, "bin")
lib_dir = os.path.join(ver_dir, "lib")
for exe, dll in FLAVOURS:
if os.path.isfile(os.path.join(bin_dir, exe)):
print(f"Found GhostScript: {ver_dir}")
return bin_dir, lib_dir, exe, dll
return None
result = find_ghostscript()
if result is None:
print("WARNING: GhostScript is NOT installed on this machine.")
print()
print(" The exe will still build successfully, but GhostScript will")
print(" NOT be bundled. On the target machine the app will fall back")
print(" to SumatraPDF for printing (which may produce dotted output).")
print()
print(" To get sharp vector-quality printing, install GhostScript:")
print(" https://ghostscript.com/releases/gsdnld.html")
print(" Then re-run this script before building.")
print()
sys.exit(0)
src_bin, src_lib, exe_name, dll_name = result
# Create destination folders
os.makedirs(DEST_BIN, exist_ok=True)
os.makedirs(DEST_LIB, exist_ok=True)
# Copy executable and DLL
print("Copying GhostScript binaries...")
for fname in (exe_name, dll_name):
src = os.path.join(src_bin, fname)
dst = os.path.join(DEST_BIN, fname)
if os.path.isfile(src):
shutil.copy2(src, dst)
print(f" + {fname}")
else:
print(f" WARNING: {fname} not found in {src_bin}")
# Copy lib/ (PostScript init files .ps)
print()
print("Copying GhostScript lib (PostScript init files)...")
ps_files = glob.glob(os.path.join(src_lib, "*.ps"))
for ps in ps_files:
shutil.copy2(ps, DEST_LIB)
print(f" + {len(ps_files)} .ps files copied from {src_lib}")
# Report
bin_count = len(os.listdir(DEST_BIN))
lib_count = len(os.listdir(DEST_LIB))
print()
print("=" * 60)
print(" GhostScript prepared successfully in conf\\ghostscript\\")
print("=" * 60)
print()
print(f" bin\\ : {bin_count} file(s)")
print(f" lib\\ : {lib_count} file(s)")
print()
print("GhostScript will be embedded into LabelPrinter.exe at build time.")
print()