Do not include foreground layer if no foreground pixels

This commit is contained in:
RunasSudo 2025-09-02 21:34:29 +10:00
parent 18cbc2bd56
commit 6fbd9de2c9
Signed by: RunasSudo
GPG Key ID: 7234E476BF21C61A
4 changed files with 28 additions and 16 deletions

View File

@ -43,8 +43,8 @@ class CompressionOptions:
@dataclass @dataclass
class CompressedPage: class CompressedPage:
fg: CompressedLayer fg: Optional[CompressedLayer]
bg: CompressedLayer bg: Optional[CompressedLayer]
def compress_pages( def compress_pages(
input_pages: InputPages, input_pages: InputPages,
@ -104,6 +104,9 @@ def compress_layer(
tempdir: str tempdir: str
) -> CompressedLayer: ) -> CompressedLayer:
if layer is None:
return None
# Compress the given layer # Compress the given layer
if compression == 'iw44': if compression == 'iw44':
return iw44_compress_layer(layer=layer, dpi=input_pages.dpi, tempdir=tempdir) return iw44_compress_layer(layer=layer, dpi=input_pages.dpi, tempdir=tempdir)

View File

@ -42,16 +42,19 @@ def djvu_write_pages(
# Combine foreground and background # Combine foreground and background
_, page_djvu_file = tempfile.mkstemp(suffix='.djvu', dir=tempdir) _, 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))] 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)) args.append('Sjbz={}'.format(compressed_page.fg.filename))
if compressed_page.bg:
args.append('BG44={}'.format(compressed_page.bg.filename)) args.append('BG44={}'.format(compressed_page.bg.filename))
subprocess.run(args, check=True, capture_output=True) subprocess.run(args, check=True, capture_output=True)
djvu_page_files.append(page_djvu_file) djvu_page_files.append(page_djvu_file)
finally: finally:
# Clean up # Clean up
if compressed_page.bg:
compressed_page.bg.cleanup() compressed_page.bg.cleanup()
if compressed_page.fg:
compressed_page.fg.cleanup() compressed_page.fg.cleanup()
# Combine pages # Combine pages

View File

@ -42,13 +42,14 @@ def pdf_write_pages(
page = pdf.add_blank_page(page_size=(width_pt, height_pt)) page = pdf.add_blank_page(page_size=(width_pt, height_pt))
# Write each layer to the page # Write each layer to the page
# TODO: Handle case where empty background or foreground
content_instructions = [] 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.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) pdf_write_layer(input_pages=input_pages, pdf=pdf, page=page, layer=compressed_page.fg, is_foreground=True, content_instructions=content_instructions)
# Clean up # Clean up
if compressed_page.bg:
compressed_page.bg.cleanup() compressed_page.bg.cleanup()
if compressed_page.fg:
compressed_page.fg.cleanup() compressed_page.fg.cleanup()
# Generate content stream # Generate content stream
@ -73,6 +74,9 @@ def pdf_write_layer(
content_instructions, content_instructions,
) -> None: ) -> None:
if layer is None:
return
# Write the layer to PDF # Write the layer to PDF
if isinstance(layer, JBIG2Layer): if isinstance(layer, JBIG2Layer):
pdf_write_image( pdf_write_image(

View File

@ -20,12 +20,12 @@ import numpy
from PIL import Image from PIL import Image
from dataclasses import dataclass from dataclasses import dataclass
from typing import Generator, List from typing import Generator, List, Optional
@dataclass @dataclass
class SegmentedPage: class SegmentedPage:
fg: Image fg: Optional[Image]
bg: Image bg: Optional[Image]
def segment_pages(input_pages: InputPages) -> Generator[SegmentedPage]: def segment_pages(input_pages: InputPages) -> Generator[SegmentedPage]:
for page_num, input_page in enumerate(input_pages.pages): 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] numpy_bg[fg_pixels,:] = [255, 255, 255]
image_bg = Image.fromarray(numpy_bg, image_rgb.mode) 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) return SegmentedPage(fg=image_fg, bg=image_bg)
else:
return SegmentedPage(fg=None, bg=image_bg)