คู่มือการดึงรูปภาพจาก PDF และสร้าง Markdown พร้อม Alternative Text ด้วย Docling#
1. เป้าหมาย#
คู่มือนี้อธิบายวิธีใช้ Docling เพื่อแปลงเอกสาร PDF เป็นรูปแบบ Markdown พร้อมกับ:
- ดึงรูปภาพออกจาก PDF — บันทึกรูปภาพแต่ละภาพเป็นไฟล์แยกต่างหาก หรือฝัง (embed) เป็น base64 ภายในไฟล์ Markdown
- สร้าง Alternative Text (Alt Text) อัตโนมัติ — ใช้โมเดล AI (Vision-Language Model) วิเคราะห์รูปภาพและสร้างคำอธิบายสำหรับ
ใน 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 พร้อม 
│
└── 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 | โมเดล | หมายเหตุ |
|---|---|---|
smolvlm | SmolVLM | Default - เร็ว ขนาดเล็ก |
granite_vision | Granite-Vision-3.3-2B | แนะนำ - สมดุล |
pixtral | Pixtral | ความสามารถสูง |
qwen | Qwen-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" |  | ไฟล์เดียว (portable) |
REFERENCED | "referenced" |  | 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
ผลลัพธ์:

โหมด CAPTION#
ใช้ caption ของรูปภาพ (ถ้ามีใน PDF) เป็น alt text
params = MarkdownParams(
image_mode=ImageRefMode.REFERENCED,
image_alt_mode=ImageAltTextMode.CAPTION,
)
ผลลัพธ์:

หากไม่มี caption จะ fallback เป็น
"Image"
โหมด DESCRIPTION#
ใช้คำอธิบายที่ AI สร้างขึ้น (ต้องเปิด do_picture_description=True)
params = MarkdownParams(
image_mode=ImageRefMode.REFERENCED,
image_alt_mode=ImageAltTextMode.DESCRIPTION,
)
ผลลัพธ์:

หากไม่มี AI description จะ fallback เป็น
"Image"
ตาราง Fallback Logic#
| โหมด | ข้อมูลมี | ข้อมูลไม่มี |
|---|---|---|
| STATIC | "Image" | "Image" |
| CAPTION | caption text | "Image" |
| DESCRIPTION | AI 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 หลัก#
| Endpoint | Method | ใช้กับ |
|---|---|---|
/v1/convert/file | POST | อัปโหลดไฟล์ PDF โดยตรง (multipart/form-data) |
/v1/convert/source | POST | ระบุ 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_mode | Alt Text ที่ได้ |
|---|---|
"static" (default) |  เสมอ |
"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\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.

Table 1 below compares performance metrics...
โหมด REFERENCED#
รูปภาพบันทึกเป็นไฟล์แยก — ง่ายต่อ version control และ web hosting:
# Annual Report 2024
The following chart shows our growth trajectory.

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)#

เรียบง่าย backward compatible เหมาะกับกรณีที่ไม่ต้องการ alt text พิเศษ
โหมด description — AI สร้างคำอธิบาย#

เหมาะสำหรับ: accessibility, RAG pipeline, เอกสารเทคนิคที่ต้องการ context
โหมด caption — ใช้ caption จากเอกสาร#

เหมาะสำหรับ: เอกสารวิชาการ, รายงานที่มี figure captions ครบถ้วน
4.3 ตัวอย่าง Markdown สมบูรณ์#
# ผลประกอบการประจำปี 2024
## บทสรุปผู้บริหาร
รายได้รวมในปี 2024 อยู่ที่ 5.4 ล้านดอลลาร์ เติบโต 23% จากปีก่อนหน้า

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

ตลาด 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-res | 3.0 | คุณภาพสูง แต่ช้ากว่า |
| AI description | 2.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 | เอกสารขนาดใหญ่ที่มีรูปมาก |
REFERENCED | Git 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")#
ตรวจสอบตามลำดับ:
- ตรวจสอบว่าเปิด
do_picture_description=True:
pipeline_options = PdfPipelineOptions(
do_picture_description=True, # ✅ ต้องเป็น True
picture_description_preset="granite_vision",
)
- ตรวจสอบ
picture_description_area_threshold:
# รูปอาจเล็กกว่า threshold (default 0.05 = 5%)
pipeline_options = PdfPipelineOptions(
do_picture_description=True,
picture_description_area_threshold=0, # ✅ อธิบายทุกรูป
)
- ตรวจสอบว่าโมเดล 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 --> ใน output | generate_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 ไม่ load | Disk เต็ม / ไม่มี internet | ตรวจสอบ disk และ HF cache |
| 422 error ใน API | Custom config ไม่ได้เปิด | ตั้ง env var allow custom config |
| Timeout | เอกสารใหญ่ + AI | ใช้ async endpoint หรือ batch เป็นส่วนๆ |