Do not include foreground layer if no foreground pixels
This commit is contained in:
parent
18cbc2bd56
commit
6fbd9de2c9
@ -43,8 +43,8 @@ class CompressionOptions:
|
||||
|
||||
@dataclass
|
||||
class CompressedPage:
|
||||
fg: CompressedLayer
|
||||
bg: CompressedLayer
|
||||
fg: Optional[CompressedLayer]
|
||||
bg: Optional[CompressedLayer]
|
||||
|
||||
def compress_pages(
|
||||
input_pages: InputPages,
|
||||
@ -104,6 +104,9 @@ def compress_layer(
|
||||
tempdir: str
|
||||
) -> CompressedLayer:
|
||||
|
||||
if layer is None:
|
||||
return None
|
||||
|
||||
# Compress the given layer
|
||||
if compression == 'iw44':
|
||||
return iw44_compress_layer(layer=layer, dpi=input_pages.dpi, tempdir=tempdir)
|
||||
|
@ -42,16 +42,19 @@ def djvu_write_pages(
|
||||
# Combine foreground and background
|
||||
_, page_djvu_file = tempfile.mkstemp(suffix='.djvu', dir=tempdir)
|
||||
|
||||
# TODO: Handle case where empty background or foreground
|
||||
args = ['djvumake', page_djvu_file, 'INFO={},{},{}'.format(input_pages.width, input_pages.height, round(input_pages.dpi))]
|
||||
if compressed_page.fg:
|
||||
args.append('Sjbz={}'.format(compressed_page.fg.filename))
|
||||
if compressed_page.bg:
|
||||
args.append('BG44={}'.format(compressed_page.bg.filename))
|
||||
subprocess.run(args, check=True, capture_output=True)
|
||||
|
||||
djvu_page_files.append(page_djvu_file)
|
||||
finally:
|
||||
# Clean up
|
||||
if compressed_page.bg:
|
||||
compressed_page.bg.cleanup()
|
||||
if compressed_page.fg:
|
||||
compressed_page.fg.cleanup()
|
||||
|
||||
# Combine pages
|
||||
|
@ -42,13 +42,14 @@ def pdf_write_pages(
|
||||
page = pdf.add_blank_page(page_size=(width_pt, height_pt))
|
||||
|
||||
# Write each layer to the page
|
||||
# TODO: Handle case where empty background or foreground
|
||||
content_instructions = []
|
||||
pdf_write_layer(input_pages=input_pages, pdf=pdf, page=page, layer=compressed_page.bg, is_foreground=False, content_instructions=content_instructions)
|
||||
pdf_write_layer(input_pages=input_pages, pdf=pdf, page=page, layer=compressed_page.fg, is_foreground=True, content_instructions=content_instructions)
|
||||
|
||||
# Clean up
|
||||
if compressed_page.bg:
|
||||
compressed_page.bg.cleanup()
|
||||
if compressed_page.fg:
|
||||
compressed_page.fg.cleanup()
|
||||
|
||||
# Generate content stream
|
||||
@ -73,6 +74,9 @@ def pdf_write_layer(
|
||||
content_instructions,
|
||||
) -> None:
|
||||
|
||||
if layer is None:
|
||||
return
|
||||
|
||||
# Write the layer to PDF
|
||||
if isinstance(layer, JBIG2Layer):
|
||||
pdf_write_image(
|
||||
|
@ -20,12 +20,12 @@ import numpy
|
||||
from PIL import Image
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Generator, List
|
||||
from typing import Generator, List, Optional
|
||||
|
||||
@dataclass
|
||||
class SegmentedPage:
|
||||
fg: Image
|
||||
bg: Image
|
||||
fg: Optional[Image]
|
||||
bg: Optional[Image]
|
||||
|
||||
def segment_pages(input_pages: InputPages) -> Generator[SegmentedPage]:
|
||||
for page_num, input_page in enumerate(input_pages.pages):
|
||||
@ -81,6 +81,8 @@ def segment_page(input_page: Image) -> SegmentedPage:
|
||||
numpy_bg[fg_pixels,:] = [255, 255, 255]
|
||||
image_bg = Image.fromarray(numpy_bg, image_rgb.mode)
|
||||
|
||||
# TODO: Handle case where empty background or foreground
|
||||
|
||||
# Handle case where empty background or foreground
|
||||
if numpy.any(fg_pixels):
|
||||
return SegmentedPage(fg=image_fg, bg=image_bg)
|
||||
else:
|
||||
return SegmentedPage(fg=None, bg=image_bg)
|
||||
|
Loading…
x
Reference in New Issue
Block a user