Documents
คู่มือการดึงรูปภาพจาก PDF และสร้าง Markdown พร้อม Alternative Text ด้วย Docling
คู่มือการดึงรูปภาพจาก PDF และสร้าง Markdown พร้อม Alternative Text ด้วย Docling
Type
Document
Status
Published
Created
May 27, 2026
Updated
May 27, 2026

คู่มือการดึงรูปภาพจาก PDF และสร้าง Markdown พร้อม Alternative Text ด้วย Docling#

1. เป้าหมาย#

คู่มือนี้อธิบายวิธีใช้ Docling เพื่อแปลงเอกสาร PDF เป็นรูปแบบ Markdown พร้อมกับ:

  1. ดึงรูปภาพออกจาก PDF — บันทึกรูปภาพแต่ละภาพเป็นไฟล์แยกต่างหาก หรือฝัง (embed) เป็น base64 ภายในไฟล์ Markdown
  2. สร้าง Alternative Text (Alt Text) อัตโนมัติ — ใช้โมเดล AI (Vision-Language Model) วิเคราะห์รูปภาพและสร้างคำอธิบายสำหรับ ![alt text](image_path) ใน Markdown

ทำไมถึงสำคัญ?#

  • Accessibility: Alt text ช่วยให้ Screen Reader อ่านได้และเป็น Web Accessibility มาตรฐาน
  • RAG / Gen AI: เอกสาร Markdown ที่มี alt text สมบูรณ์ช่วยให้ระบบ AI เข้าใจเนื้อหารูปภาพได้ดีขึ้น
  • Documentation: เอกสารที่ได้มีความสมบูรณ์ทั้งข้อความและรูปภาพพร้อมคำอธิบาย

Workflow ภาพรวม#

PDF Document
Docling Pipeline (PdfPipelineOptions)
    ├── generate_picture_images=True → ดึงรูปภาพ
    ├── images_scale=2.0 → ความละเอียดสูง
    └── do_picture_description=True → AI สร้าง description
DoclingDocument
    ├── export_to_markdown(image_mode=ImageRefMode.REFERENCED)
    │ → Markdown พร้อม ![alt](path/to/image.png)
    └── save_as_markdown(...)
            → บันทึกไฟล์ .md พร้อมโฟลเดอร์รูปภาพ

วิธีที่รองรับ#

วิธีเหมาะกับรายละเอียด
Python SDKนักพัฒนา, batch processing, automationควบคุมได้ละเอียด ยืดหยุ่นสูง
REST API (docling-serve)ระบบ microservice, ทีมต่างภาษาง่าย ใช้ HTTP request ได้ทันที

2. วิธีที่ 1: ใช้ Python SDK#

2.1 การติดตั้ง#

ติดตั้ง Docling ด้วย pip:

pip install docling

ข้อกำหนดระบบ:

  • Python 3.9 ขึ้นไป
  • สำหรับ do_picture_description=True: ต้องการ GPU (แนะนำ) หรือ CPU ที่มี RAM เพียงพอสำหรับโหลด vision model

2.2 การตั้งค่า Pipeline Options#

Docling ใช้ PdfPipelineOptions ในการควบคุมกระบวนการแปลง PDF

generate_picture_images=True#

เปิดใช้งานการดึงรูปภาพ (PictureItem) ออกจาก PDF เป็นภาพแยกต่างหาก

pipeline_options = PdfPipelineOptions(
    generate_picture_images=True # Default: False
)

หมายเหตุ: หากไม่ตั้งค่า generate_picture_images=True รูปภาพจะถูกแทนที่ด้วย placeholder เท่านั้น

images_scale=2.0#

ปรับความละเอียดของรูปภาพที่ดึงออกมา

pipeline_options = PdfPipelineOptions(
    generate_picture_images=True,
    images_scale=2.0 # Default: 1.0, CLI default: 2.0
)
ค่า images_scaleผลลัพธ์ขนาดไฟล์
1.0 (default)ความละเอียดปกติเล็ก
2.0 (แนะนำ)ความละเอียดสูงขึ้น 2×กลาง
3.0+ความละเอียดสูงมากใหญ่

⚠️ คำเตือน: มีรายงานปัญหา image cropping เมื่อ images_scale > 1.0 ในบางเวอร์ชัน หากพบปัญหา ให้ลองใช้ images_scale=1.0 ก่อน

do_picture_description=True#

เปิดใช้งาน AI Vision-Language Model เพื่อสร้างคำอธิบายรูปภาพ

pipeline_options = PdfPipelineOptions(
    generate_picture_images=True,
    do_picture_description=True # Default: False
)

picture_description_preset="granite_vision"#

เลือก preset ของโมเดลที่ใช้สร้างคำอธิบาย

Available presets สำหรับ picture description:

Presetโมเดลหมายเหตุ
smolvlmSmolVLMDefault - เร็ว ขนาดเล็ก
granite_visionGranite-Vision-3.3-2Bแนะนำ - สมดุล
pixtralPixtralความสามารถสูง
qwenQwen-VLทางเลือก
pipeline_options = PdfPipelineOptions(
    do_picture_description=True,
    picture_description_preset="granite_vision"
)

picture_description_area_threshold#

กำหนดขนาดขั้นต่ำของรูปภาพ (เทียบกับพื้นที่หน้า) ที่จะประมวลผล

pipeline_options = PdfPipelineOptions(
    do_picture_description=True,
    picture_description_area_threshold=0 # อธิบาย *ทุก* รูป (default: 0.05 = 5%)
)
ค่าผล
0อธิบายทุกรูป ไม่ว่าจะเล็กแค่ไหน
0.05 (default)อธิบายเฉพาะรูปที่ใหญ่กว่า 5% ของหน้า
0.1อธิบายเฉพาะรูปที่ใหญ่กว่า 10% ของหน้า

ImageRefMode — ควบคุมการฝังรูปภาพใน Markdown#

ImageRefMode enum จาก docling_core.types.doc ควบคุมว่ารูปภาพจะปรากฏใน Markdown อย่างไร

โหมดค่าผลลัพธ์ใน Markdownเหมาะกับ
PLACEHOLDER"placeholder"<!-- image -->ทดสอบ layout
EMBEDDED"embedded"![Image](data:image/png;base64,...)ไฟล์เดียว (portable)
REFERENCED"referenced"![Image](images/img_001.png)Version control, เว็บ

2.3 ตัวอย่างโค้ดสมบูรณ์#

from pathlib import Path
from docling.document_converter import DocumentConverter, PdfFormatOption
from docling.datamodel.pipeline_options import PdfPipelineOptions
from docling.datamodel.base_models import InputFormat
from docling_core.types.doc import ImageRefMode

# 1. ตั้งค่า Pipeline Options
pipeline_options = PdfPipelineOptions(
    generate_picture_images=True, # ดึงรูปภาพออกมา
    images_scale=2.0, # ความละเอียดสูงขึ้น 2×
    do_picture_description=True, # สร้าง AI description
    picture_description_preset="granite_vision", # ใช้ Granite Vision
    picture_description_area_threshold=0, # อธิบายทุกรูป
)

# 2. สร้าง DocumentConverter
converter = DocumentConverter(
    format_options={
        InputFormat.PDF: PdfFormatOption(
            pipeline_options=pipeline_options
        )
    }
)

# 3. แปลงเอกสาร
result = converter.convert("document.pdf")

# 4. Export เป็น Markdown
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

# วิธีที่ 1: บันทึกไฟล์ .md พร้อมโฟลเดอร์รูปภาพ (แนะนำ)
result.document.save_as_markdown(
    output_dir / "document.md",
    image_mode=ImageRefMode.REFERENCED # รูปภาพอยู่ในโฟลเดอร์แยก
)

# วิธีที่ 2: ดึง Markdown string โดยตรง (รูปภาพเป็น base64)
markdown_str = result.document.export_to_markdown(
    image_mode=ImageRefMode.EMBEDDED # รูปภาพอยู่ใน Markdown เลย
)
print(markdown_str[:500]) # แสดง 500 ตัวอักษรแรก

อธิบายผลลัพธ์:

  • save_as_markdown(..., image_mode=ImageRefMode.REFERENCED) จะสร้าง:
    • ไฟล์ output/document.md
    • โฟลเดอร์ output/document_artifacts/ ที่มีรูปภาพทั้งหมด

2.4 การควบคุม Alt Text ด้วย image_alt_mode (ฟีเจอร์กำลังพัฒนา)#

🔬 สถานะ: ฟีเจอร์นี้อยู่ใน PR #463 ของ docling-core ยังไม่ merge เข้า main branch ติดตามสถานะได้ที่ github.com/docling-project/docling-core/pull/463

เมื่อ merge แล้ว จะสามารถใช้ ImageAltTextMode เพื่อควบคุม alt text ใน Markdown ได้ 3 โหมด :

โหมด STATIC (default)#

ใช้ข้อความ "Image" ตายตัว — เรียบง่าย backward compatible

from docling_core.transforms.serializer.markdown import (
    MarkdownDocSerializer,
    MarkdownParams,
    ImageAltTextMode,
)

serializer = MarkdownDocSerializer(
    doc=result.document,
    params=MarkdownParams(
        image_mode=ImageRefMode.REFERENCED,
        image_alt_mode=ImageAltTextMode.STATIC, # default
    )
)
output = serializer.serialize().text

ผลลัพธ์:

![Image](images/image_001.png)

โหมด CAPTION#

ใช้ caption ของรูปภาพ (ถ้ามีใน PDF) เป็น alt text

params = MarkdownParams(
    image_mode=ImageRefMode.REFERENCED,
    image_alt_mode=ImageAltTextMode.CAPTION,
)

ผลลัพธ์:

![Figure 1: Revenue growth comparison 2020-2024](images/image_001.png)

หากไม่มี caption จะ fallback เป็น "Image"

โหมด DESCRIPTION#

ใช้คำอธิบายที่ AI สร้างขึ้น (ต้องเปิด do_picture_description=True)

params = MarkdownParams(
    image_mode=ImageRefMode.REFERENCED,
    image_alt_mode=ImageAltTextMode.DESCRIPTION,
)

ผลลัพธ์:

![A bar chart showing revenue growth from 2020 to 2024, with values increasing from $2M to $5M](images/image_001.png)

หากไม่มี AI description จะ fallback เป็น "Image"

ตาราง Fallback Logic#

โหมดข้อมูลมีข้อมูลไม่มี
STATIC"Image""Image"
CAPTIONcaption text"Image"
DESCRIPTIONAI description"Image"

3. วิธีที่ 2: ใช้ REST API (docling-serve)#

docling-serve คือ HTTP API server สำหรับ Docling เหมาะกับการ integrate ใน microservice หรือใช้งานจากหลายภาษา


3.1 การติดตั้งและรัน docling-serve#

ติดตั้ง:

# ติดตั้งพื้นฐาน
pip install docling-serve

# ติดตั้งพร้อม UI สำหรับทดสอบ
pip install "docling-serve[ui]"

รัน server:

# รัน server พื้นฐาน (port 5001 โดย default)
docling-serve run

# รันพร้อม UI สำหรับทดสอบที่ http://localhost:5001/ui
docling-serve run --enable-ui

Server จะรันที่ http://localhost:5001 โดย default

เปิดใช้ Remote Services (สำหรับ custom VLM API):

export DOCLING_SERVE_ENABLE_REMOTE_SERVICES=true
docling-serve run

API Documentation: เข้าถึงได้ที่ http://localhost:5001/docs (Swagger UI)


3.2 Endpoints หลัก#

EndpointMethodใช้กับ
/v1/convert/filePOSTอัปโหลดไฟล์ PDF โดยตรง (multipart/form-data)
/v1/convert/sourcePOSTระบุ URL หรือ base64 ใน JSON body


3.3 ตัวอย่าง API Request#

วิธีที่ 1: อัปโหลดไฟล์ด้วย multipart/form-data (/v1/convert/file)#

curl -X POST "http://localhost:5001/v1/convert/file" \
  -H "accept: application/json" \
  -F "files=@document.pdf;type=application/pdf" \
  -F "to_formats=md" \
  -F "generate_picture_images=true" \
  -F "images_scale=2.0" \
  -F "do_picture_description=true" \
  -F "picture_description_preset=granite_vision" \
  -F "picture_description_area_threshold=0" \
  -F "image_export_mode=referenced"

วิธีที่ 2: ระบุ URL ด้วย JSON payload (/v1/convert/source)#

curl -X POST "http://localhost:5001/v1/convert/source" \
  -H "Content-Type: application/json" \
  -d '{
    "options": {
      "to_formats": ["md"],
      "do_picture_description": true,
      "picture_description_preset": "granite_vision",
      "picture_description_area_threshold": 0,
      "image_export_mode": "referenced"
    },
    "sources": [
      { "kind": "http", "url": "https://example.com/document.pdf" }
    ]
  }'

วิธีที่ 3: ส่งไฟล์เป็น base64 ใน JSON (/v1/convert/source)#

# Encode ไฟล์เป็น base64 ก่อน
BASE64_PDF=$(base64 -w0 document.pdf)

curl -X POST "http://localhost:5001/v1/convert/source" \
  -H "Content-Type: application/json" \
  -d "{
    \"options\": {
      \"to_formats\": [\"md\"],
      \"do_picture_description\": true,
      \"picture_description_preset\": \"granite_vision\",
      \"picture_description_area_threshold\": 0,
      \"image_export_mode\": \"embedded\"
    },
    \"file_sources\": [{
      \"base64_string\": \"$BASE64_PDF\",
      \"filename\": \"document.pdf\"
    }]
  }"

หมายเหตุ: URL sources ไม่ต้องการ base64 encoding — Docling จะดาวน์โหลดไฟล์เองโดยตรง


3.4 การตั้งค่า image_export_mode ใน API#

image_export_mode ใน options ของ REST API ทำหน้าที่เดียวกับ ImageRefMode ใน Python SDK

ค่าผลลัพธ์
"placeholder"แทนที่รูปด้วย <!-- image -->
"embedded"รูปภาพเป็น base64 ใน Markdown (default)
"referenced"รูปภาพเป็น URL path แยกไฟล์

3.5 การใช้ image_alt_mode ใน API#

🔬 สถานะ: image_alt_mode อยู่ในเอกสาร knowledge base ของ Docling และ PR ที่เกี่ยวข้อง — ตรวจสอบว่ารองรับใน docling-serve เวอร์ชันที่คุณใช้งาน

ตามเอกสาร API ของ Docling , สามารถควบคุม alt text ได้ผ่าน image_alt_mode ใน options:

curl -X POST "http://localhost:5001/v1/convert/source" \
  -H "Content-Type: application/json" \
  -d '{
    "options": {
      "to_formats": ["md"],
      "do_picture_description": true,
      "picture_description_preset": "granite_vision",
      "picture_description_area_threshold": 0,
      "image_export_mode": "referenced",
      "image_alt_mode": "description"
    },
    "sources": [
      { "kind": "http", "url": "https://example.com/document.pdf" }
    ]
  }'

ค่าที่รองรับ :

image_alt_modeAlt Text ที่ได้
"static" (default)![Image](...) เสมอ
"caption"ใช้ caption ของรูป, fallback เป็น "Image"
"description"ใช้ AI description, fallback เป็น "Image"

ตัวอย่างพร้อม Classification Filters#

curl -X POST "http://localhost:5001/v1/convert/source" \
  -H "Content-Type: application/json" \
  -d '{
    "options": {
      "to_formats": ["md"],
      "do_picture_description": true,
      "picture_description_preset": "granite_vision",
      "picture_description_area_threshold": 0,
      "image_export_mode": "referenced",
      "image_alt_mode": "description",
      "classification_allow": ["photograph", "bar_chart", "pie_chart", "line_chart"],
      "classification_min_confidence": 0.7
    },
    "sources": [
      { "kind": "http", "url": "https://example.com/document.pdf" }
    ]
  }'

อธิบายเฉพาะรูปที่จัดประเภทเป็น photograph หรือ chart และ confidence ≥ 70%


3.6 รูปแบบ Response#

{
  "document": {
    "md_content": "# เนื้อหาเอกสาร\n\n![AI description here](images/img_001.png)\n\n..."
  },
  "status": "success"
}

Markdown output จะอยู่ใน response.document.md_content

4. ผลลัพธ์ที่ได้#

4.1 รูปแบบ Markdown ตามโหมด image_mode / image_export_mode#

โหมด PLACEHOLDER#

รูปภาพถูกแทนที่ด้วย comment — ใช้สำหรับทดสอบ layout หรือต้องการเฉพาะข้อความ:

# Annual Report 2024

The following chart shows our growth trajectory.

<!-- image -->

Table 1 below compares performance metrics...

โหมด EMBEDDED#

รูปภาพถูก encode เป็น base64 ฝังตรงในไฟล์ Markdown — ไฟล์เดียวพกพาได้:

# Annual Report 2024

The following chart shows our growth trajectory.

![Image](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...)

Table 1 below compares performance metrics...

โหมด REFERENCED#

รูปภาพบันทึกเป็นไฟล์แยก — ง่ายต่อ version control และ web hosting:

# Annual Report 2024

The following chart shows our growth trajectory.

![Image](document_artifacts/pictures/picture_001.png)

Table 1 below compares performance metrics...

โครงสร้างไฟล์ที่ได้:

output/
├── document.md
└── document_artifacts/
    └── pictures/
        ├── picture_001.png
        ├── picture_002.png
        └── picture_003.png

4.2 รูปแบบ Markdown ตามโหมด image_alt_mode#

(ใช้ร่วมกับ image_mode=REFERENCED เป็นตัวอย่าง)

โหมด static (default)#

![Image](document_artifacts/pictures/picture_001.png)

เรียบง่าย backward compatible เหมาะกับกรณีที่ไม่ต้องการ alt text พิเศษ

โหมด description — AI สร้างคำอธิบาย#

![A bar chart showing quarterly revenue growth from Q1 2020 to Q4 2024. Revenue increased steadily from $2.1M in Q1 2020 to $5.4M in Q4 2024, with the highest growth rate occurring between 2022 and 2023.](document_artifacts/pictures/picture_001.png)

เหมาะสำหรับ: accessibility, RAG pipeline, เอกสารเทคนิคที่ต้องการ context

โหมด caption — ใช้ caption จากเอกสาร#

![Figure 3: Quarterly Revenue Growth 2020-2024 (Source: Finance Department)](document_artifacts/pictures/picture_001.png)

เหมาะสำหรับ: เอกสารวิชาการ, รายงานที่มี figure captions ครบถ้วน


4.3 ตัวอย่าง Markdown สมบูรณ์#

# ผลประกอบการประจำปี 2024

## บทสรุปผู้บริหาร

รายได้รวมในปี 2024 อยู่ที่ 5.4 ล้านดอลลาร์ เติบโต 23% จากปีก่อนหน้า

![A bar chart showing quarterly revenue growth from Q1 2020 to Q4 2024. Values range from $2.1M to $5.4M with consistent upward trend.](document_artifacts/pictures/picture_001.png)

ดังแสดงในแผนภูมิ รายได้เติบโตต่อเนื่องทุกไตรมาส โดยเฉพาะในช่วงปี 2022-2023

## ตลาดหลัก

![Pie chart showing market distribution: Asia Pacific 45%, Americas 30%, Europe 20%, Others 5%](document_artifacts/pictures/picture_002.png)

ตลาด Asia Pacific ยังคงเป็นตลาดหลักที่สำคัญที่สุด คิดเป็น 45% ของรายได้รวม

Alt text ที่ AI สร้างช่วยให้ผู้ใช้ Screen Reader และระบบ Gen AI เข้าใจเนื้อหารูปภาพได้โดยไม่ต้องมองเห็น

5. เคล็ดลับและแนวทางปฏิบัติที่ดี (Tips and Best Practices)#

5.1 การเพิ่มความละเอียดของรูปภาพ#

images_scale ควบคุม pixel density ของรูปภาพที่ดึงออกมา

pipeline_options = PdfPipelineOptions(
    generate_picture_images=True,
    images_scale=2.0, # แนะนำ: 2.0 สำหรับงานทั่วไป
)

การเลือกค่า images_scale:

Use Caseค่าแนะนำเหตุผล
Preview / ดูเร็ว1.0เร็ว ไฟล์เล็ก
งานทั่วไป2.0สมดุลระหว่างคุณภาพและขนาด
Print / High-res3.0คุณภาพสูง แต่ช้ากว่า
AI description2.0เพียงพอสำหรับ VLM model

⚠️ ค่า > 2.0 อาจทำให้เกิด image cropping bugs ในบางเวอร์ชัน แนะนำให้ทดสอบก่อน production


5.2 การกรองรูปภาพที่ต้องการอธิบาย#

ใช้ classification filters เพื่อประหยัด compute และ API calls :

ตัวอย่าง: อธิบายเฉพาะ chart และ photograph

# Python SDK (ผ่าน custom_config - ต้องการ admin permission ใน docling-serve)
from docling.datamodel.pipeline_options import PictureDescriptionApiOptions

pipeline_options = PdfPipelineOptions(
    do_picture_description=True,
    picture_description_preset="granite_vision",
    picture_description_area_threshold=0.02, # รูปที่ใหญ่กว่า 2% ของหน้า
)

ผ่าน REST API:

{
  "options": {
    "do_picture_description": true,
    "picture_description_preset": "granite_vision",
    "picture_description_area_threshold": 0.02,
    "classification_allow": ["photograph", "bar_chart", "pie_chart", "line_chart", "scatter_plot"],
    "classification_min_confidence": 0.7
  }
}

Classification labels ที่รองรับ :

หมวดLabels
รูปภาพphotograph, full_page_image
แผนภูมิbar_chart, pie_chart, line_chart, scatter_plot, box_plot
แผนผังengineering_drawing, chemistry_structure
แผนที่geographical_map, topographical_map
อื่นๆtable, screenshot_from_computer, music, calendar

5.3 การเลือกโหมด Export ที่เหมาะสม#

โหมดเหมาะกับไม่เหมาะกับ
PLACEHOLDERดูโครงสร้างเอกสาร, pipeline ที่ไม่ต้องการรูปงาน production ที่ต้องการรูป
EMBEDDEDส่งไฟล์เดียว, email attachmentเอกสารขนาดใหญ่ที่มีรูปมาก
REFERENCEDGit repository, website, CMSกรณีต้องการ portable single file
# แนะนำสำหรับงาน production ส่วนใหญ่
result.document.save_as_markdown(
    output_dir / "document.md",
    image_mode=ImageRefMode.REFERENCED
)

# สำหรับ portable single file
markdown_text = result.document.export_to_markdown(
    image_mode=ImageRefMode.EMBEDDED
)

5.4 การทำงานกับ Custom VLM หรือ OpenAI API#

หากต้องการใช้ OpenAI GPT-4o หรือ model อื่นๆ สามารถใช้ picture_description_custom_config ได้ (ต้องการ admin permission ใน docling-serve) :

# ต้องเปิดใช้งานก่อน:
export DOCLING_SERVE_ALLOW_CUSTOM_PICTURE_DESCRIPTION_CONFIG=true
export DOCLING_SERVE_ENABLE_REMOTE_SERVICES=true
{
  "options": {
    "to_formats": ["md"],
    "do_picture_description": true,
    "picture_description_custom_config": {
      "engine_options": { "engine_type": "api" },
      "model_spec": {
        "name": "GPT-4o Vision",
        "default_repo_id": "openai/gpt-4o",
        "prompt": "Describe this image concisely in 1-2 sentences for use as alt text.",
        "response_format": "text"
      },
      "api_overrides": {
        "api": {
          "url": "https://api.openai.com/v1/chat/completions",
          "headers": { "Authorization": "Bearer YOUR_OPENAI_API_KEY" },
          "params": { "model": "gpt-4o" }
        }
      }
    },
    "image_alt_mode": "description",
    "image_export_mode": "referenced"
  },
  "sources": [{ "kind": "http", "url": "https://example.com/document.pdf" }]
}

5.5 ประสิทธิภาพและการใช้ทรัพยากร#

GPU vs CPU#

ทรัพยากรgranite_vision (2B params)smolvlm
GPU VRAM (แนะนำ)~4 GB~2 GB
CPU RAM~8 GB~4 GB
เวลาต่อรูป (GPU)~1-3 วินาที~0.5-1 วินาที
เวลาต่อรูป (CPU)~10-30 วินาที~5-15 วินาที

แนวทางสำหรับ Batch Processing#

from pathlib import Path
from docling.document_converter import DocumentConverter, PdfFormatOption
from docling.datamodel.pipeline_options import PdfPipelineOptions
from docling.datamodel.base_models import InputFormat
from docling_core.types.doc import ImageRefMode

pipeline_options = PdfPipelineOptions(
    generate_picture_images=True,
    images_scale=2.0,
    do_picture_description=True,
    picture_description_preset="granite_vision",
    picture_description_area_threshold=0.05, # ข้ามรูปเล็กเพื่อประหยัดเวลา
)

converter = DocumentConverter(
    format_options={InputFormat.PDF: PdfFormatOption(pipeline_options=pipeline_options)}
)

pdf_files = list(Path("pdfs/").glob("*.pdf"))
output_dir = Path("output")
output_dir.mkdir(exist_ok=True)

# Batch convert
for pdf_path in pdf_files:
    print(f"Processing: {pdf_path.name}")
    result = converter.convert(str(pdf_path))
    out_path = output_dir / pdf_path.stem
    out_path.mkdir(exist_ok=True)
    result.document.save_as_markdown(
        out_path / f"{pdf_path.stem}.md",
        image_mode=ImageRefMode.REFERENCED
    )
    print(f" → Saved to {out_path}")

Memory Tips สำหรับเอกสารขนาดใหญ่#

  • ใช้ page_range เพื่อแปลงทีละส่วน
  • ตั้ง picture_description_area_threshold=0.05 เพื่อข้ามรูปขนาดเล็ก
  • หากไม่ต้องการ page images ให้ตั้ง generate_page_images=False (default)

6. แก้ไขปัญหาที่พบบ่อย (Troubleshooting)#

6.1 รูปภาพไม่ปรากฏใน Markdown (เห็นแค่ <!-- image -->)#

สาเหตุ: generate_picture_images=False (default) หรือ image_mode=ImageRefMode.PLACEHOLDER

แก้ไข:

pipeline_options = PdfPipelineOptions(
    generate_picture_images=True, # ✅ ต้องตั้งเป็น True
)

result.document.save_as_markdown(
    "output.md",
    image_mode=ImageRefMode.REFERENCED # ✅ ไม่ใช่ PLACEHOLDER
)

6.2 รูปภาพถูก crop ผิดหรือ bounding box ไม่ถูกต้อง#

สาเหตุ: Bug ที่รู้จักใน Docling เมื่อตั้ง images_scale > 1.0

แก้ไข:

# ชั่วคราว: ใช้ scale=1.0 แล้ว upscale เองทีหลัง
pipeline_options = PdfPipelineOptions(
    generate_picture_images=True,
    images_scale=1.0 # ✅ ใช้ 1.0 หากพบ cropping bug
)

ติดตามสถานะ bug ได้ที่ github.com/docling-project/docling/issues/2416


6.3 AI Description ไม่ทำงาน (alt text เป็นแค่ "Image")#

ตรวจสอบตามลำดับ:

  1. ตรวจสอบว่าเปิด do_picture_description=True:
pipeline_options = PdfPipelineOptions(
    do_picture_description=True, # ✅ ต้องเป็น True
    picture_description_preset="granite_vision",
)
  1. ตรวจสอบ picture_description_area_threshold:
# รูปอาจเล็กกว่า threshold (default 0.05 = 5%)
pipeline_options = PdfPipelineOptions(
    do_picture_description=True,
    picture_description_area_threshold=0, # ✅ อธิบายทุกรูป
)
  1. ตรวจสอบว่าโมเดล download สำเร็จ:
# ดู log ขณะรัน
python -c "
from docling.datamodel.pipeline_options import PdfPipelineOptions
opts = PdfPipelineOptions(do_picture_description=True, picture_description_preset='granite_vision')
print('Options created successfully')
"

6.4 โมเดล Download ช้าหรือล้มเหลว#

Docling จะ download model ครั้งแรกโดยอัตโนมัติจาก Hugging Face Hub

แก้ไขสำหรับ environment ที่ไม่มี internet:

# 1. Download model บนเครื่องที่มี internet
huggingface-cli download ibm-granite/granite-vision-3.3-2b

# 2. ระบุ path ใน environment variable
export HF_HOME=/path/to/local/models
export TRANSFORMERS_OFFLINE=1

ตรวจสอบ disk space:

Modelขนาดประมาณ
smolvlm~1.5 GB
granite_vision~4 GB

6.5 Error ใน docling-serve: 422 Unprocessable Entity#

สาเหตุที่พบบ่อย:

สาเหตุแก้ไข
ใช้ picture_description_custom_config โดยไม่ได้เปิดใน adminตั้ง env: DOCLING_SERVE_ALLOW_CUSTOM_PICTURE_DESCRIPTION_CONFIG=true
picture_description_preset ที่ระบุไม่ได้รับอนุญาตตรวจสอบ DOCLING_SERVE_ALLOWED_VLM_PRESETS env var
JSON syntax ผิดตรวจสอบ JSON format ด้วย jq

# ตรวจสอบ JSON ก่อนส่ง
echo '{"options": {...}}' | jq .

6.6 docling-serve ไม่ตอบสนอง (Timeout)#

สาเหตุ: เอกสารใหญ่ + AI description ใช้เวลานาน

แก้ไข:

# เพิ่ม timeout ใน curl
curl --max-time 300 -X POST ...

# หรือใช้ async endpoint
POST /v1/convert/file/async
POST /v1/convert/source/async

6.7 ImportError หรือ ModuleNotFoundError#

# ติดตั้งใหม่แบบ clean
pip uninstall docling docling-core docling-ibm-models -y
pip install docling

# ตรวจสอบ dependencies
pip show docling

6.8 สรุปตาราง Troubleshooting#

อาการสาเหตุที่น่าจะเป็นแก้ไขด่วน
<!-- image --> ใน outputgenerate_picture_images=Falseเพิ่ม generate_picture_images=True
รูปภาพ crop ผิดimages_scale > 1.0 bugลด scale เป็น 1.0
Alt text เป็น "Image" ทุกรูปdo_picture_description=Falseเปิด do_picture_description=True
Model ไม่ loadDisk เต็ม / ไม่มี internetตรวจสอบ disk และ HF cache
422 error ใน APICustom config ไม่ได้เปิดตั้ง env var allow custom config
Timeoutเอกสารใหญ่ + AIใช้ async endpoint หรือ batch เป็นส่วนๆ
คู่มือการดึงรูปภาพจาก PDF และสร้าง Markdown พร้อม Alternative Text ด้วย Docling | Dosu