Extract and save page images, figures, and tables from PDFs with customizable resolution.
Overview
This example demonstrates:
- Generating page images during conversion
- Extracting figure and table images
- Saving images as PNG files
- Exporting Markdown with embedded or referenced images
- Exporting HTML with image references
Enable Image Generation
from pathlib import Path
from docling_core.types.doc import ImageRefMode, PictureItem, TableItem
from docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import PdfPipelineOptions
from docling.document_converter import DocumentConverter, PdfFormatOption
IMAGE_RESOLUTION_SCALE = 2.0
input_doc_path = Path("tests/data/pdf/2206.01062.pdf")
output_dir = Path("scratch")
# Configure pipeline to generate images
pipeline_options = PdfPipelineOptions()
pipeline_options.images_scale = IMAGE_RESOLUTION_SCALE # scale=1 ~ 72 DPI
pipeline_options.generate_page_images = True
pipeline_options.generate_picture_images = True
doc_converter = DocumentConverter(
format_options={
InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)
}
)
conv_res = doc_converter.convert(input_doc_path)
output_dir.mkdir(parents=True, exist_ok=True)
images_scale=1.0 corresponds to 72 DPI. Increase the scale for higher resolution images.
Export Page Images
Iterate Through Pages
Loop through document pages and access page images.
Save as PNG
Write each page image to disk.
doc_filename = conv_res.input.file.stem
# Save page images
for page_no, page in conv_res.document.pages.items():
page_image_filename = output_dir / f"{doc_filename}-{page_no}.png"
with page_image_filename.open("wb") as fp:
page.image.pil_image.save(fp, format="PNG")
table_counter = 0
picture_counter = 0
for element, _level in conv_res.document.iterate_items():
if isinstance(element, TableItem):
table_counter += 1
element_image_filename = (
output_dir / f"{doc_filename}-table-{table_counter}.png"
)
with element_image_filename.open("wb") as fp:
element.get_image(conv_res.document).save(fp, "PNG")
if isinstance(element, PictureItem):
picture_counter += 1
element_image_filename = (
output_dir / f"{doc_filename}-picture-{picture_counter}.png"
)
with element_image_filename.open("wb") as fp:
element.get_image(conv_res.document).save(fp, "PNG")
Export Markdown with Images
from docling_core.types.doc import ImageRefMode
md_filename = output_dir / f"{doc_filename}-with-images.md"
conv_res.document.save_as_markdown(
md_filename,
image_mode=ImageRefMode.EMBEDDED
)
Image Modes
Docling supports three image reference modes:
- EMBEDDED: Images are base64-encoded and embedded directly in the output
- REFERENCED: Images are saved to disk and referenced by file path
- PLACEHOLDER: Images are replaced with placeholder text
Complete Example
from pathlib import Path
from docling_core.types.doc import ImageRefMode, PictureItem, TableItem
from docling.datamodel.base_models import InputFormat
from docling.datamodel.pipeline_options import PdfPipelineOptions
from docling.document_converter import DocumentConverter, PdfFormatOption
IMAGE_RESOLUTION_SCALE = 2.0
input_doc_path = Path("document.pdf")
output_dir = Path("scratch")
pipeline_options = PdfPipelineOptions()
pipeline_options.images_scale = IMAGE_RESOLUTION_SCALE
pipeline_options.generate_page_images = True
pipeline_options.generate_picture_images = True
doc_converter = DocumentConverter(
format_options={
InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)
}
)
conv_res = doc_converter.convert(input_doc_path)
output_dir.mkdir(parents=True, exist_ok=True)
doc_filename = conv_res.input.file.stem
# Save page images
for page_no, page in conv_res.document.pages.items():
page_image_filename = output_dir / f"{doc_filename}-{page_no}.png"
with page_image_filename.open("wb") as fp:
page.image.pil_image.save(fp, format="PNG")
# Save figures and tables
table_counter = 0
picture_counter = 0
for element, _level in conv_res.document.iterate_items():
if isinstance(element, TableItem):
table_counter += 1
filename = output_dir / f"{doc_filename}-table-{table_counter}.png"
with filename.open("wb") as fp:
element.get_image(conv_res.document).save(fp, "PNG")
if isinstance(element, PictureItem):
picture_counter += 1
filename = output_dir / f"{doc_filename}-picture-{picture_counter}.png"
with filename.open("wb") as fp:
element.get_image(conv_res.document).save(fp, "PNG")
# Export markdown with embedded images
conv_res.document.save_as_markdown(
output_dir / f"{doc_filename}-with-images.md",
image_mode=ImageRefMode.EMBEDDED
)