Can now generate PDF/A files, multipage and single page

This commit is contained in:
Jim Barlow
2015-07-23 04:57:31 -07:00
parent 5df187c086
commit 6dc2782e80
2 changed files with 69 additions and 11 deletions
+65 -8
View File
@@ -1,31 +1,33 @@
#!/usr/bin/env python3
from contextlib import suppress
from tempfile import NamedTemporaryFile
import sys
import os.path
import os
import fileinput
import re
from parse import parse
import PyPDF2 as pypdf
import shutil
from contextlib import suppress
import warnings
import multiprocessing
import PyPDF2 as pypdf
from parse import parse
from subprocess import Popen, check_call, PIPE, CalledProcessError, \
TimeoutExpired
try:
from subprocess import DEVNULL
except ImportError:
import os
DEVNULL = open(os.devnull, 'wb')
from ruffus import transform, suffix, merge, active_if, regex, jobs_limit, \
mkdir, formatter, follows, subdivide
import ruffus.cmdline as cmdline
import warnings
import multiprocessing
from .hocrtransform import HocrTransform
from .pageinfo import pdf_get_all_pageinfo
from .pdfa import generate_pdfa_def
warnings.simplefilter('ignore', pypdf.utils.PdfReadWarning)
@@ -277,11 +279,66 @@ def split_pages(
]
check_call(args_pdfseparate)
log.info(pdfinfo[0]['width_inches'])
@transform(
input=split_pages,
filter=suffix('.page.pdf'),
output='.done.pdf',
output_dir=options.temp_folder,
extras=[_log, _pdfinfo, _pdfinfo_lock])
def noop(
input_file,
output_file,
log,
pdfinfo,
pdfinfo_lock):
shutil.copy(input_file, output_file)
@transform(
input=clean_pdf,
filter=suffix('.cleaned.pdf'),
output='.pdfa_def.ps',
output_dir=options.temp_folder,
extras=[_log])
def generate_postscript_stub(
input_file,
output_file,
log):
generate_pdfa_def(output_file)
@merge(
input=[noop, generate_postscript_stub],
output=options.output_file,
extras=[_log, _pdfinfo, _pdfinfo_lock])
def merge_pages(
input_files,
output_file,
log,
pdfinfo,
pdfinfo_lock):
ocr_pages, postscript = input_files[0:-1], input_files[-1]
with NamedTemporaryFile(delete=True) as gs_pdf:
args_gs = [
"gs",
"-dQUIET",
"-dBATCH",
"-dNOPAUSE",
"-sDEVICE=pdfwrite",
"-sColorConversionStrategy=/RGB",
"-sProcessColorModel=DeviceRGB",
"-dPDFA",
"-sPDFACompatibilityPolicy=2",
"-sOutputICCProfile=srgb.icc",
"-sOutputFile=" + gs_pdf.name,
postscript, # the PDF/A definition header
]
args_gs.extend(ocr_pages)
check_call(args_gs)
shutil.copy(gs_pdf.name, output_file)
+4 -3
View File
@@ -3,6 +3,7 @@
from subprocess import Popen, PIPE
import PyPDF2 as pypdf
from decimal import Decimal
FRIENDLY_COLORSPACE = {
@@ -53,8 +54,8 @@ def _pdf_get_pageinfo(infile, page: int):
page = pdf.pages[page - 1]
width_pt = page['/MediaBox'][2] - page['/MediaBox'][0]
height_pt = page['/MediaBox'][3] - page['/MediaBox'][1]
pageinfo['width_inches'] = width_pt / 72.0
pageinfo['height_inches'] = height_pt / 72.0
pageinfo['width_inches'] = width_pt / Decimal(72.0)
pageinfo['height_inches'] = height_pt / Decimal(72.0)
if '/XObject' not in page['/Resources']:
# Missing /XObject means no images or possibly corrupt PDF
@@ -90,7 +91,7 @@ def _pdf_get_pageinfo(infile, page: int):
image['comp'] = FRIENDLY_COMP.get(image['color'], '?')
image['dpi_w'] = image['width'] / pageinfo['width_inches']
image['dpi_h'] = image['height'] / pageinfo['height_inches']
image['dpi'] = (image['dpi_w'] * image['dpi_h']) ** 0.5
image['dpi'] = (image['dpi_w'] * image['dpi_h']) ** Decimal(0.5)
pageinfo['images'].append(image)
if pageinfo['images']: