Experimental change to use qpdf to merge files (disables Ghostscript)

All but one tests pass, test_input_file_not_a_pdf

Not sure if PyPDF2 metadata generation will mangle the first page.
This commit is contained in:
James R. Barlow
2016-08-03 00:56:44 -07:00
parent 2b10df7b74
commit 5c99acf6d1
2 changed files with 46 additions and 5 deletions
+25 -4
View File
@@ -1134,8 +1134,8 @@ def merge_pages_ghostscript(
@active_if(options.output_type == 'pdf')
@merge(
input=[add_text_layer, render_hocr_debug_page, skip_page,
tesseract_ocr_and_render_pdf],
output=os.path.join(work_folder, 'merged_nometadata.pdf'),
tesseract_ocr_and_render_pdf, repair_pdf],
output=os.path.join(work_folder, 'merged.pdf'),
extras=[_log, _pdfinfo, _pdfinfo_lock])
def merge_pages_qpdf(
input_files,
@@ -1144,6 +1144,10 @@ def merge_pages_qpdf(
pdfinfo,
pdfinfo_lock):
metadata_file = next(
(ii for ii in input_files if ii.endswith('.repaired.pdf')))
input_files.remove(metadata_file)
def input_file_order(s):
'''Sort order: All rendered pages followed
by their debug page.'''
@@ -1154,10 +1158,27 @@ def merge_pages_qpdf(
pdf_pages = sorted(input_files, key=input_file_order)
log.debug("Final pages: " + "\n".join(pdf_pages))
reader_metadata = pypdf.PdfFileReader(metadata_file)
pdfmark = get_pdfmark(reader_metadata)
pdfmark['/Producer'] = 'qpdf ' + qpdf.version()
first_page = pypdf.PdfFileReader(pdf_pages[0])
writer = pypdf.PdfFileWriter()
writer.appendPagesFromReader(first_page)
writer.addMetadata(pdfmark)
writer_file = pdf_pages[0].replace('.pdf', '.metadata.pdf')
with open(writer_file, 'wb') as f:
writer.write(f)
pdf_pages[0] = writer_file
qpdf.merge(pdf_pages, output_file)
@active_if(options.output_type == 'pdf')
#@active_if(options.output_type == 'pdf')
@active_if(False)
@merge(
input=[merge_pages_qpdf, repair_pdf],
output=os.path.join(work_folder, 'merged.pdf'),
@@ -1188,7 +1209,7 @@ def copy_metadata(
@merge(
input=[merge_pages_ghostscript, copy_metadata],
input=[merge_pages_ghostscript, merge_pages_qpdf],
output=options.output_file,
extras=[_log, _pdfinfo, _pdfinfo_lock])
def copy_final(
+21 -1
View File
@@ -2,12 +2,32 @@
# © 2015 James R. Barlow: github.com/jbarlow83
from subprocess import CalledProcessError, check_output, STDOUT, check_call
from functools import lru_cache
import sys
import os
import re
from . import ExitCode, get_program
@lru_cache(maxsize=1)
def version():
args_qpdf = [
get_program('qpdf'),
'--version'
]
try:
versions = check_output(
args_qpdf, close_fds=True, universal_newlines=True,
stderr=STDOUT)
except CalledProcessError:
print("Could not find qpdf executable on system PATH.")
sys.exit(ExitCode.missing_dependency)
qpdf_version = re.match(r'qpdf version (.+)', versions).group(1)
return qpdf_version
def check(input_file, log):
args_qpdf = [
get_program('qpdf'),
@@ -20,7 +40,7 @@ def check(input_file, log):
except CalledProcessError as e:
if e.returncode == 2:
log.error("{0}: not a valid PDF, and could not repair it.".format(
input_file))
input_file))
log.error("Details:")
log.error(e.output)
elif e.returncode == 3: