Add MCP server code
This commit is contained in:
commit
5e89bc2b26
16 files changed
+1803
No files matched your search
@@ -0,0 +1 @@
|
||||
*.pdf
|
||||
@@ -0,0 +1,171 @@
|
||||
"""Generate test PDF fixtures for the pdf-mcp test suite."""
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import fitz
|
||||
|
||||
ASSETS = Path(__file__).parent
|
||||
|
||||
|
||||
def create_basic():
|
||||
"""Simple 3-page PDF with metadata, TOC, headers/footers, and searchable text."""
|
||||
doc = fitz.open()
|
||||
doc.set_metadata({
|
||||
"title": "Test Document",
|
||||
"author": "Test Author",
|
||||
"subject": "Testing",
|
||||
"keywords": "test, pdf, mcp",
|
||||
"creator": "generate.py",
|
||||
})
|
||||
|
||||
pages_content = [
|
||||
"This is the first page.\nIt contains introductory material.",
|
||||
"The second page has more detail.\nDatasheet specs go here.",
|
||||
"Final page with a summary.\nContact: test@example.com",
|
||||
]
|
||||
|
||||
for i, body in enumerate(pages_content, 1):
|
||||
page = doc.new_page(width=595, height=842) # A4
|
||||
# Header
|
||||
page.insert_text((72, 30), f"Test Document - Header", fontsize=8, color=(0.5, 0.5, 0.5))
|
||||
# Footer
|
||||
page.insert_text((72, 820), f"Page {i} of 3", fontsize=8, color=(0.5, 0.5, 0.5))
|
||||
# Body
|
||||
page.insert_text((72, 80), f"Chapter {i}", fontsize=18)
|
||||
y = 120
|
||||
for line in body.split("\n"):
|
||||
page.insert_text((72, y), line, fontsize=11)
|
||||
y += 16
|
||||
|
||||
doc.set_toc([
|
||||
[1, "Chapter 1", 1],
|
||||
[1, "Chapter 2", 2],
|
||||
[1, "Chapter 3", 3],
|
||||
])
|
||||
doc.save(ASSETS / "basic.pdf")
|
||||
doc.close()
|
||||
|
||||
|
||||
def create_with_diagrams():
|
||||
"""PDF with vector drawings to test image rendering."""
|
||||
doc = fitz.open()
|
||||
page = doc.new_page(width=595, height=842)
|
||||
|
||||
page.insert_text((72, 60), "Page with Diagrams", fontsize=16)
|
||||
|
||||
# Draw some shapes to simulate a diagram
|
||||
# Rectangle
|
||||
shape = page.new_shape()
|
||||
shape.draw_rect(fitz.Rect(72, 100, 250, 200))
|
||||
shape.finish(color=(0, 0, 0), fill=(0.9, 0.9, 1), width=1.5)
|
||||
shape.commit()
|
||||
|
||||
page.insert_text((110, 160), "Component A", fontsize=10)
|
||||
|
||||
shape = page.new_shape()
|
||||
shape.draw_rect(fitz.Rect(320, 100, 500, 200))
|
||||
shape.finish(color=(0, 0, 0), fill=(1, 0.9, 0.9), width=1.5)
|
||||
shape.commit()
|
||||
|
||||
page.insert_text((360, 160), "Component B", fontsize=10)
|
||||
|
||||
# Arrow between boxes
|
||||
shape = page.new_shape()
|
||||
shape.draw_line(fitz.Point(250, 150), fitz.Point(320, 150))
|
||||
shape.finish(color=(0, 0, 0), width=2)
|
||||
shape.commit()
|
||||
|
||||
# Circle
|
||||
shape = page.new_shape()
|
||||
shape.draw_circle(fitz.Point(286, 350), 80)
|
||||
shape.finish(color=(0, 0.4, 0), fill=(0.9, 1, 0.9), width=1.5)
|
||||
shape.commit()
|
||||
|
||||
page.insert_text((250, 355), "Sensor Node", fontsize=10)
|
||||
|
||||
# Table-like grid
|
||||
page.insert_text((72, 480), "Pin Configuration", fontsize=12)
|
||||
y_start = 500
|
||||
for row in range(5):
|
||||
for col in range(4):
|
||||
x = 72 + col * 120
|
||||
y = y_start + row * 25
|
||||
shape = page.new_shape()
|
||||
shape.draw_rect(fitz.Rect(x, y, x + 120, y + 25))
|
||||
shape.finish(color=(0, 0, 0), width=0.5)
|
||||
shape.commit()
|
||||
if row == 0:
|
||||
labels = ["Pin", "Name", "Type", "Description"]
|
||||
page.insert_text((x + 4, y + 17), labels[col], fontsize=9)
|
||||
else:
|
||||
vals = [str(row), f"GPIO_{row}", "I/O", f"General purpose {row}"]
|
||||
page.insert_text((x + 4, y + 17), vals[col], fontsize=8)
|
||||
|
||||
doc.save(ASSETS / "diagrams.pdf")
|
||||
doc.close()
|
||||
|
||||
|
||||
def create_nested_toc():
|
||||
"""PDF with a multi-level table of contents."""
|
||||
doc = fitz.open()
|
||||
|
||||
sections = [
|
||||
(1, "Introduction"),
|
||||
(1, "Architecture"),
|
||||
(2, "Frontend"),
|
||||
(2, "Backend"),
|
||||
(3, "Database Layer"),
|
||||
(3, "API Layer"),
|
||||
(1, "Deployment"),
|
||||
(2, "Docker Setup"),
|
||||
(2, "Kubernetes"),
|
||||
]
|
||||
|
||||
toc = []
|
||||
for i, (level, title) in enumerate(sections, 1):
|
||||
page = doc.new_page(width=595, height=842)
|
||||
indent = " " * (level - 1)
|
||||
page.insert_text((72, 80), f"{indent}{title}", fontsize=max(18 - level * 2, 11))
|
||||
page.insert_text((72, 120), f"Content for section: {title}", fontsize=11)
|
||||
toc.append([level, title, i])
|
||||
|
||||
doc.set_toc(toc)
|
||||
doc.save(ASSETS / "nested_toc.pdf")
|
||||
doc.close()
|
||||
|
||||
|
||||
def create_search_targets():
|
||||
"""PDF with known text patterns for testing search."""
|
||||
doc = fitz.open()
|
||||
|
||||
page1 = doc.new_page()
|
||||
page1.insert_text((72, 80), "Resistance values and specifications", fontsize=14)
|
||||
page1.insert_text((72, 110), "The resistance of R1 is 10kΩ at 25°C.", fontsize=11)
|
||||
page1.insert_text((72, 130), "Maximum voltage rating: 3.3V DC.", fontsize=11)
|
||||
page1.insert_text((72, 150), "Operating temperature range: -40°C to +85°C.", fontsize=11)
|
||||
page1.insert_text((72, 180), "UNIQUE_MARKER_ALPHA found on page 1.", fontsize=11)
|
||||
|
||||
page2 = doc.new_page()
|
||||
page2.insert_text((72, 80), "Timing characteristics", fontsize=14)
|
||||
page2.insert_text((72, 110), "Clock frequency: 16MHz typical.", fontsize=11)
|
||||
page2.insert_text((72, 130), "Rise time: 5ns maximum.", fontsize=11)
|
||||
page2.insert_text((72, 150), "UNIQUE_MARKER_BETA found on page 2.", fontsize=11)
|
||||
page2.insert_text((72, 170), "The resistance measurement should be verified.", fontsize=11)
|
||||
|
||||
page3 = doc.new_page()
|
||||
page3.insert_text((72, 80), "Ordering information", fontsize=14)
|
||||
page3.insert_text((72, 110), "Part number: ABC-123-XYZ", fontsize=11)
|
||||
page3.insert_text((72, 130), "UNIQUE_MARKER_ALPHA also on page 3.", fontsize=11)
|
||||
|
||||
doc.save(ASSETS / "search_targets.pdf")
|
||||
doc.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
create_basic()
|
||||
create_with_diagrams()
|
||||
create_nested_toc()
|
||||
create_search_targets()
|
||||
print(f"Generated test PDFs in {ASSETS}")
|
||||
for f in sorted(ASSETS.glob("*.pdf")):
|
||||
print(f" {f.name}")
|
||||
Reference in new issue
Block a user