Redirect stderr->stdout to hopefully make GS output easier to work with overall, since the previous code didn’t seem to account for mixed used properly.
83 lines
2.7 KiB
Python
83 lines
2.7 KiB
Python
#!/usr/bin/env python3
|
|
# © 2015 James R. Barlow: github.com/jbarlow83
|
|
|
|
from tempfile import NamedTemporaryFile
|
|
from subprocess import Popen, PIPE, STDOUT, check_call
|
|
from shutil import copy
|
|
from . import get_program
|
|
from .pdfa import SRGB_ICC_PROFILE
|
|
|
|
|
|
def rasterize_pdf(input_file, output_file, xres, yres, raster_device, log,
|
|
pageno=1):
|
|
with NamedTemporaryFile(delete=True) as tmp:
|
|
args_gs = [
|
|
get_program('gs'),
|
|
'-dQUIET',
|
|
'-dSAFER',
|
|
'-dBATCH',
|
|
'-dNOPAUSE',
|
|
'-sDEVICE=%s' % raster_device,
|
|
'-dFirstPage=%i' % pageno,
|
|
'-dLastPage=%i' % pageno,
|
|
'-o', tmp.name,
|
|
'-r{0}x{1}'.format(str(round(xres)), str(round(yres))),
|
|
input_file
|
|
]
|
|
|
|
p = Popen(args_gs, close_fds=True, stdout=PIPE, stderr=STDOUT,
|
|
universal_newlines=True)
|
|
stdout, _ = p.communicate()
|
|
if 'error' in stdout:
|
|
log.error(stdout) # Ghostscript puts errors in stdout
|
|
else:
|
|
log.debug(stdout)
|
|
|
|
if p.returncode == 0:
|
|
copy(tmp.name, output_file)
|
|
else:
|
|
log.error('Ghostscript rendering failed')
|
|
|
|
|
|
def generate_pdfa(pdf_pages, output_file, log, threads=1):
|
|
with NamedTemporaryFile(delete=True) as gs_pdf:
|
|
args_gs = [
|
|
get_program("gs"),
|
|
"-dQUIET",
|
|
"-dBATCH",
|
|
"-dNOPAUSE",
|
|
'-dNumRenderingThreads=' + str(threads),
|
|
"-sDEVICE=pdfwrite",
|
|
"-dAutoRotatePages=/None",
|
|
"-sColorConversionStrategy=/RGB",
|
|
"-sProcessColorModel=DeviceRGB",
|
|
"-dJPEGQ=95",
|
|
"-dPDFA=2",
|
|
"-dPDFACompatibilityPolicy=1",
|
|
"-sOutputFile=" + gs_pdf.name,
|
|
]
|
|
args_gs.extend(pdf_pages)
|
|
p = Popen(args_gs, close_fds=True, stdout=PIPE, stderr=STDOUT,
|
|
universal_newlines=True)
|
|
stdout, _ = p.communicate()
|
|
|
|
if 'error' in stdout:
|
|
log.error(stdout)
|
|
elif 'overprint mode not set' in stdout:
|
|
# Unless someone is going to print PDF/A documents on a
|
|
# magical sRGB printer I can't see the removal of overprinting
|
|
# being a problem....
|
|
log.debug(
|
|
"Ghostscript had to remove PDF 'overprinting' from the "
|
|
"input file to complete PDF/A conversion. "
|
|
)
|
|
else:
|
|
log.debug(stdout)
|
|
|
|
if p.returncode == 0:
|
|
# Ghostscript does not change return code when it fails to create
|
|
# PDF/A - check PDF/A status elsewhere
|
|
copy(gs_pdf.name, output_file)
|
|
else:
|
|
log.error('Ghostscript PDF/A failed')
|