add rich output support for slide notes
Docker server image / build-and-push (push) Successful in 3m2s

This commit is contained in:
2026-05-07 10:35:37 -07:00
parent 500b767d58
commit 06d4122e4e
11 changed files with 831 additions and 140 deletions
@@ -23,6 +23,7 @@ class ConversionSession:
thumbnail_resolution: conversion_pb2.ConversionResolution
full_jpeg_quality: int
thumbnail_jpeg_quality: int
notes: conversion_pb2.NotesOptions | None = None
bucket_name: str
upload_object_key: str
status: conversion_pb2.ConversionStatus
@@ -18,6 +18,9 @@ from google.protobuf.timestamp_pb2 import Timestamp
from officeconvert import SlideArtifact, convert_pptx_to_slidedeck
from officeconvert.conversion import (
ConversionTimeoutError,
HtmlFormattingPolicy,
NotesFormat,
NotesOptions,
PHASE_EXTRACTING_NOTES,
PHASE_PDF_TO_IMAGES,
PHASE_PPTX_TO_PDF,
@@ -49,6 +52,37 @@ _DEFAULT_FULL_RESOLUTION = conversion_pb2.CONVERSION_RESOLUTION_FHD
_DEFAULT_THUMBNAIL_RESOLUTION = conversion_pb2.CONVERSION_RESOLUTION_SD
_DEFAULT_FULL_JPEG_QUALITY = 85
_DEFAULT_THUMBNAIL_JPEG_QUALITY = 75
_DEFAULT_NOTES_FORMAT = conversion_pb2.NOTES_FORMAT_PLAIN
_DEFAULT_HTML_USE_PARAGRAPH_TAGS = True
def _to_library_notes_options(
notes: conversion_pb2.NotesOptions | None,
) -> NotesOptions | None:
if notes is None:
return None
fmt = notes.format or _DEFAULT_NOTES_FORMAT
library_format = NotesFormat.HTML if fmt == conversion_pb2.NOTES_FORMAT_HTML else NotesFormat.PLAIN
html_use_paragraph_tags = _DEFAULT_HTML_USE_PARAGRAPH_TAGS
if notes.HasField("html_use_paragraph_tags"):
html_use_paragraph_tags = bool(notes.html_use_paragraph_tags)
policy_proto = notes.html_policy
policy = HtmlFormattingPolicy(
ignore_bold=bool(policy_proto.ignore_bold),
ignore_italic=bool(policy_proto.ignore_italic),
ignore_underline=bool(policy_proto.ignore_underline),
ignore_strikethrough=bool(policy_proto.ignore_strikethrough),
ignore_font_size=bool(policy_proto.ignore_font_size),
ignore_color=bool(policy_proto.ignore_color),
)
return NotesOptions(
format=library_format,
html_use_paragraph_tags=html_use_paragraph_tags,
html_policy=policy,
)
class ConversionServiceImpl(conversion_connect.ConversionService):
@@ -124,6 +158,7 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
thumbnail_resolution=thumbnail_resolution,
full_jpeg_quality=full_jpeg_quality,
thumbnail_jpeg_quality=thumbnail_jpeg_quality,
notes=request.notes if request.HasField("notes") else None,
bucket_name=bucket_name,
upload_object_key=upload_key,
status=conversion_pb2.CONVERSION_STATUS_PENDING,
@@ -280,6 +315,7 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
pptx_to_pdf_per_slide_timeout_s=self._config.conversion_pptx_to_pdf_per_slide_timeout_seconds,
pdf_to_images_base_timeout_s=self._config.conversion_pdf_to_images_base_timeout_seconds,
pdf_to_images_per_slide_timeout_s=self._config.conversion_pdf_to_images_per_slide_timeout_seconds,
notes_options=_to_library_notes_options(session.notes),
progress_callback=lambda phase_name, current, max_value: self._set_session_progress_from_name(
session,
phase_name=phase_name,
@@ -428,6 +464,7 @@ class ConversionServiceImpl(conversion_connect.ConversionService):
conversion_pb2.Slide(
index=slide.index,
notes_plain=slide.notes_plain,
notes_html=slide.notes_html,
image_url=image_url,
thumbnail_image_url=thumbnail_image_url,
)