From c35ec0b4aaec4c4c6c84bf0e38e54155912f4b21 Mon Sep 17 00:00:00 2001 From: "James R. Barlow" Date: Sat, 3 Dec 2016 00:22:03 -0800 Subject: [PATCH] ghostscript: more effort at error logging --- ocrmypdf/__main__.py | 2 +- ocrmypdf/ghostscript.py | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/ocrmypdf/__main__.py b/ocrmypdf/__main__.py index 566e5acf..8c2f54e2 100755 --- a/ocrmypdf/__main__.py +++ b/ocrmypdf/__main__.py @@ -1283,7 +1283,7 @@ def merge_pages_ghostscript( pdf_pages = sorted(input_files, key=input_file_order) log.debug("Final pages: " + "\n".join(pdf_pages)) - ghostscript.generate_pdfa(pdf_pages, output_file, options.jobs or 1) + ghostscript.generate_pdfa(pdf_pages, output_file, log, options.jobs or 1) @posttask(partial(done_task, 'merge_pages_qpdf')) diff --git a/ocrmypdf/ghostscript.py b/ocrmypdf/ghostscript.py index cbf22ee8..ee1b5bad 100644 --- a/ocrmypdf/ghostscript.py +++ b/ocrmypdf/ghostscript.py @@ -42,7 +42,7 @@ def rasterize_pdf(input_file, output_file, xres, yres, raster_device, log, log.error('Ghostscript rendering failed') -def generate_pdfa(pdf_pages, output_file, threads=1): +def generate_pdfa(pdf_pages, output_file, log, threads=1): with NamedTemporaryFile(delete=True) as gs_pdf: args_gs = [ get_program("gs"), @@ -60,5 +60,28 @@ def generate_pdfa(pdf_pages, output_file, threads=1): "-sOutputFile=" + gs_pdf.name, ] args_gs.extend(pdf_pages) - check_call(args_gs) - copy(gs_pdf.name, output_file) + p = Popen(args_gs, close_fds=True, stdout=PIPE, stderr=PIPE, + universal_newlines=True) + stdout, stderr = p.communicate() + if stdout: + 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 stderr: + log.error(stderr) + + 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')