AI 레시피
복사. 붙여넣기. 배포. |
실제 사용 사례를 위한 15가지 프로덕션 준비 레시피. 개발자를 위한, 개발자에 의한. 쓸데없는 것 없음.
15 레시피
5 언어
0 필요한 SDK
AI-IDP + Bounding Boxes – 값이 어디에 있는지 보여줍니다
AI PDF Split – 최대 3000페이지
VISITOR Mode – 가입 없이 테스트
MCP Protocol – 네이티브 IDE 통합
🚀 빠른 성공
몇 초 만에 생산성 향상
한 줄 코드 및 최소한의 코드로 즉시 복사 및 붙여넣기
송장 데이터를 문서 위치와 함께 추출하여 검증 UI에 사용.
# VISITOR Mode - kein Token nötig!
# AI-IDP Invoice mit Bounding Boxes
curl -X POST "https://api.paperoffice.ai/latest/job" \
-F "file_1=@invoice.pdf" \
-F "model=premium" \
-F "idp_collection=invoice" \
-F "priority=900"
# Response enthält BOUNDING BOXES!
# → "vendor": {"value": "Acme Corp", "bbox": [x1, y1, x2, y2]} import requests
# VISITOR Mode - kein Token nötig!
response = requests.post(
"https://api.paperoffice.ai/latest/job",
files={"file_1": open("invoice.pdf", "rb")},
data={
"model": "premium",
"idp_collection": "invoice",
"priority": 900
}
)
# Bounding Boxes zeigen WO der Wert steht!
result = response.json()
for field, data in result["job_result"]["fields"].items():
print(f"{field}: {data['value']} @ {data['bbox']}") // VISITOR Mode - kein Token nötig!
const form = new FormData();
form.append('file_1', fs.createReadStream('invoice.pdf'));
form.append('model', 'premium');
form.append('idp_collection', 'invoice');
form.append('priority', '900');
const response = await fetch('https://api.paperoffice.ai/latest/job', {
method: 'POST',
body: form
});
// Bounding Boxes für jedes extrahierte Feld!
const { job_result } = await response.json();
console.log(job_result.fields.vendor); // { value: "Acme", bbox: [...] } 이미지/PDF에서 텍스트를 한 줄로 추출. VISITOR 모드 = 토큰 불필요!
# KEIN TOKEN NÖTIG! VISITOR Mode = kostenlos testen
curl -X POST "https://api.paperoffice.ai/latest/job" \
-F "file_1=@document.png" \
-F "ocr_mode=complete" \
-F "priority=900"
# ocr_mode: complete (+tables), grid (+bbox), text (nur Text) import requests
# VISITOR Mode - kein Token nötig!
response = requests.post(
"https://api.paperoffice.ai/latest/job",
files={"file_1": open("document.png", "rb")},
data={
"ocr_mode": "complete", # oder "grid" für nur Bounding Boxes
"priority": 900
}
)
result = response.json()
print(result["job_result"]["text"]) // VISITOR Mode - Zero Signup!
const form = new FormData();
form.append('file_1', fs.createReadStream('document.png'));
form.append('ocr_mode', 'complete'); // oder 'grid' für nur bbox
form.append('priority', '900');
const { job_result } = await fetch(
'https://api.paperoffice.ai/latest/job',
{ method: 'POST', body: form }
).then(r => r.json());
console.log(job_result.text); 대량 PDF를 지능적으로 분할. 문서 경계를 자동 감지.
# VISITOR Mode - kein Token nötig!
# AI PDF Split - bis 3000 Seiten!
curl -X POST "https://api.paperoffice.ai/latest/job" \
-F "file=@sammel_dokument.pdf" \
-F "template=pdf_ai_split" \
-F "naming_instruction=Dokumenttyp_Datum_Absender" \
-F "locale=de_DE" \
-F "priority=900"
# → AI erkennt Dokumentgrenzen automatisch! import requests
# VISITOR Mode - kein Token nötig!
response = requests.post(
"https://api.paperoffice.ai/latest/job",
files={"file": open("sammel_dokument.pdf", "rb")},
data={
"template": "pdf_ai_split",
"naming_instruction": "Dokumenttyp_Datum_Absender",
"locale": "de_DE",
"priority": 900
}
)
result = response.json()
for doc in result["job_result"]["documents_created"]:
print(f"{doc['suggested_filename']}: {doc['page_range']}") // VISITOR Mode - kein Token nötig!
const form = new FormData();
form.append('file', fs.createReadStream('sammel_dokument.pdf'));
form.append('template', 'pdf_ai_split');
form.append('naming_instruction', 'Dokumenttyp_Datum_Absender');
form.append('locale', 'de_DE');
form.append('priority', '900');
const response = await fetch('https://api.paperoffice.ai/latest/job', {
method: 'POST',
body: form
});
// AI erkennt Dokumentgrenzen automatisch
const { job_result } = await response.json();
job_result.documents_created.forEach(doc => {
console.log(doc.suggested_filename + ': ' + doc.page_range);
}); 개인 데이터 자동 감지 및 편집. 이름, IBAN, 이메일...
# VISITOR Mode - kein Token nötig!
# DSGVO Anonymisierung - PII Preview
curl -X POST "https://api.paperoffice.ai/latest/job" \
-F "file=@dokument.pdf" \
-F "template=document_anonymize_preview" \
-F "redact_categories=all" \
-F "priority=900"
# → simplified_boxes mit allen erkannten PII import requests
# VISITOR Mode - kein Token nötig!
response = requests.post(
"https://api.paperoffice.ai/latest/job",
files={"file": open("dokument.pdf", "rb")},
data={
"template": "document_anonymize_preview",
"redact_categories": "all", # oder: names,addresses,iban
"whitelist": "PaperOffice", # Diese NICHT schwärzen
"priority": 900
}
)
# Response enthält simplified_boxes mit allen PII
result = response.json()
boxes = result["job_result"]["workflow_output"]["simplified_boxes"]
print(f"Gefunden: {len(boxes)} sensible Elemente") // VISITOR Mode - kein Token nötig!
const form = new FormData();
form.append('file', fs.createReadStream('dokument.pdf'));
form.append('template', 'document_anonymize_preview');
form.append('redact_categories', 'all');
form.append('whitelist', 'PaperOffice'); // Diese NICHT schwärzen
form.append('priority', '900');
const response = await fetch('https://api.paperoffice.ai/latest/job', {
method: 'POST',
body: form
});
const { job_result } = await response.json();
const boxes = job_result.workflow_output.simplified_boxes;
console.log('Gefunden: ' + boxes.length + ' sensible Elemente'); 네이티브 음성으로 텍스트를 오디오로 변환. 다양한 언어 지원.
# VISITOR Mode - kein Token nötig!
# Text-to-Speech mit neuronalen Stimmen
curl -X POST "https://api.paperoffice.ai/latest/job" \
-F "text=Hallo, das ist ein Test der Sprachausgabe." \
-F "voice=Nadja" \
-F "output_format=mp3" \
-F "output=url" \
-F "speed=1.0" \
-F "priority=999"
# Stimmen: Nadja, Thomas, Anna, Hans (DE) + 100+ mehr import requests
# VISITOR Mode - kein Token nötig!
response = requests.post(
"https://api.paperoffice.ai/latest/job",
data={
"text": "Hallo, das ist ein Test der Sprachausgabe.",
"voice": "Nadja", # Klingt am natürlichsten
"output_format": "mp3", # oder: wav
"output": "url", # oder: base64, inline
"speed": "1.0",
"priority": 999 # Sync für TTS
}
)
result = response.json()
print(f"Audio: {result['job_result']['audio_url']}") // VISITOR Mode - kein Token nötig!
const form = new FormData();
form.append('text', 'Hallo, das ist ein Test der Sprachausgabe.');
form.append('voice', 'Nadja');
form.append('output_format', 'mp3');
form.append('output', 'url');
form.append('speed', '1.0');
form.append('priority', '999');
const response = await fetch('https://api.paperoffice.ai/latest/job', {
method: 'POST',
body: form
});
const { job_result } = await response.json();
console.log('Audio: ' + job_result.audio_url); 🤖 AI 도구 레시피
Claude, Cursor & Co.용
실제로 작동하는 프롬프트를 복사하여 붙여넣기
Prompt
Read this API documentation:
https://api.paperoffice.ai/latest/docs/postman
Create a Python script that:
1. Takes a folder of invoice PDFs
2. Extracts all fields using POST /job with idp_collection=invoice
3. Returns bounding boxes for verification (bbox array)
4. Exports to CSV
Important: Use file_1 for uploads, model=premium.
Handle both sync (priority>=900) and async modes. 바운딩 박스 검증이 포함된 완전한 Python 스크립트
Prompt
Read this API documentation:
https://api.paperoffice.ai/latest/docs/postman
Help me set up the MCP Server for PaperOffice in Cursor.
I want to use Document AI directly in my IDE.
Show me:
1. How to configure the MCP connection (POST /mcp)
2. Available tools via tools/list
3. How to process documents from my workspace MCP 서버 구성 + IDE 네이티브 Document AI
Prompt
Read this API documentation:
https://api.paperoffice.ai/latest/docs/postman
Create a voice agent that:
1. Takes audio input (Speech-to-Text)
2. Processes the text
3. Generates audio response (Text-to-Speech)
Use POST /job with:
- TTS: voice=Nadja, output_format=mp3, output=url
- Use priority=999 for sync TTS response. TTS + STT를 사용한 음성 에이전트
Prompt
Read this API documentation:
https://api.paperoffice.ai/latest/docs/postman
Build a fraud detection system that:
1. Checks device fingerprints
2. Validates IP geolocation
3. Detects suspicious patterns
Use the Security & Data AI endpoints.
These are instant APIs (no polling needed). 장치 지문을 사용한 사기 탐지
Prompt
Read this API documentation:
https://api.paperoffice.ai/latest/docs/postman
Create a batch processor that:
1. Takes a folder of large PDFs (up to 3000 pages each)
2. Uses POST /job with template=pdf_ai_split
3. Uses naming_instruction for smart filenames
4. Handles async jobs with polling (priority<900)
Use locale=de_DE for German document types. 3000페이지 PDF용 배치 프로세서
Prompt
Read this API documentation:
https://api.paperoffice.ai/latest/docs/postman
Build a document classifier that:
1. Watches a folder for new PDFs
2. Uses OCR (POST /job, ocr_mode=complete) to extract text
3. Classifies into: invoice, contract, receipt, correspondence
4. Moves files to category subfolders
5. Logs results to classification_log.csv
Use VISITOR Mode (no token) for testing.
Priority=900 for sync response. Auto-Classification System mit Folder Watch
📄 실제 사용 사례
엔드투엔드 워크플로우
실제 문제에 대한 완전한 솔루션
1 PDF 업로드
2 AI-IDP + Bounding Boxes
3 검증
4 내보내기
Python
# Produktion: Mit Token | Test: Ohne Token (VISITOR Mode)
import requests
def process_invoice(pdf_path, token=None):
# Header nur wenn Token vorhanden
headers = {"Authorization": f"Bearer {token}"} if token else {}
# 1. AI-IDP mit Bounding Boxes
response = requests.post(
"https://api.paperoffice.ai/latest/job",
headers=headers,
files={"file_1": open(pdf_path, "rb")},
data={
"model": "premium",
"idp_collection": "invoice",
"priority": 900
}
)
invoice = response.json()["job_result"]
# 2. Bounding Boxes für Review
for field, data in invoice["fields"].items():
if data.get("confidence", 0) < 0.9:
print(f"⚠️ Review: {field} @ bbox {data['bbox']}")
# 3. Export für Buchhaltung
return {
"vendor": invoice["fields"]["vendor"]["value"],
"amount": invoice["fields"]["total"]["value"],
"date": invoice["fields"]["date"]["value"],
"iban": invoice["fields"]["iban"]["value"]
}
# Test ohne Token (VISITOR Mode)
process_invoice("invoice.pdf")
# Produktion mit Token
process_invoice("invoice.pdf", "po_usr_YOUR_TOKEN") 1 계약 업로드
2 주요 용어
3 Knowledge Graph
4 알림
Python
# Produktion: Mit Token | Test: Ohne Token (VISITOR Mode)
import requests
def analyze_contract(pdf_path, token=None):
headers = {"Authorization": f"Bearer {token}"} if token else {}
# Vertrag analysieren mit AI-IDP
response = requests.post(
"https://api.paperoffice.ai/latest/job",
headers=headers,
files={"file_1": open(pdf_path, "rb")},
data={
"model": "premium",
"idp_collection": "contract",
"priority": 900
}
)
contract = response.json()["job_result"]
# Key Terms extrahieren (mit Bounding Boxes!)
key_terms = {
"parties": contract["fields"]["parties"],
"start_date": contract["fields"]["start_date"],
"end_date": contract["fields"]["end_date"],
"notice_period": contract["fields"]["notice_period"]
}
# Jedes Feld hat bbox für Verification
for field, data in key_terms.items():
print(f"{field}: {data['value']} @ {data['bbox']}")
return key_terms 1 PDF 업로드
2 형식 선택
3 변환
4 다운로드
Python
# Produktion: Mit Token | Test: Ohne Token (VISITOR Mode)
import requests
def convert_pdf(pdf_path, target_format, token=None):
"""
target_format: 'word', 'powerpoint', 'pdfa', 'webp'
"""
headers = {"Authorization": f"Bearer {token}"} if token else {}
response = requests.post(
"https://api.paperoffice.ai/latest/job",
headers=headers,
files={"file_1": open(pdf_path, "rb")},
data={
"target_format": target_format,
"priority": 900
}
)
return response.json()["job_result"]["output_url"]
# VISITOR Mode (kein Token)
word_url = convert_pdf("report.pdf", "word")
# Mit Token für Produktion
pdfa_url = convert_pdf("contract.pdf", "pdfa", "po_usr_...") 1 웹훅 등록
2 문서 전송
3 이벤트 수신
4 처리
Python
# Webhooks benötigen Token (für Account-Zuordnung)
from flask import Flask, request
import requests
import hmac
import hashlib
app = Flask(__name__)
WEBHOOK_SECRET = "your_webhook_secret"
TOKEN = "po_usr_YOUR_TOKEN" # Token erforderlich für Webhooks
# 1. Webhook registrieren
def setup_webhook():
requests.post(
"https://api.paperoffice.ai/latest/webhooks",
headers={"Authorization": f"Bearer {TOKEN}"},
json={
"url": "https://your-server.com/webhook",
"events": ["job.completed", "job.failed"],
"secret": WEBHOOK_SECRET
}
)
# 2. Webhook empfangen
@app.route("/webhook", methods=["POST"])
def handle_webhook():
signature = request.headers.get("X-PaperOffice-Signature")
expected = hmac.new(
WEBHOOK_SECRET.encode(),
request.data,
hashlib.sha256
).hexdigest()
if not hmac.compare_digest(signature, expected):
return "Invalid signature", 401
event = request.json
if event["event"] == "job.completed":
process_result(event["job_result"])
return "OK", 200 1 문서 OCR
2 텍스트 준비
3 TTS 생성
4 오디오 저장
Python
# Produktion: Mit Token | Test: Ohne Token (VISITOR Mode)
import requests
def document_to_audio(pdf_path, voice="Nadja", token=None):
headers = {"Authorization": f"Bearer {token}"} if token else {}
# 1. OCR - Text extrahieren
ocr_response = requests.post(
"https://api.paperoffice.ai/latest/job",
headers=headers,
files={"file_1": open(pdf_path, "rb")},
data={"ocr_mode": "complete", "priority": 900}
)
text = ocr_response.json()["job_result"]["text"]
# 2. Text in Abschnitte teilen (max 5000 Zeichen)
chunks = [text[i:i+5000] for i in range(0, len(text), 5000)]
# 3. TTS für jeden Abschnitt
audio_urls = []
for chunk in chunks:
tts_response = requests.post(
"https://api.paperoffice.ai/latest/job",
headers=headers,
data={
"text": chunk,
"voice": voice,
"output_format": "mp3",
"output": "url",
"priority": 999
}
)
audio_urls.append(tts_response.json()["job_result"]["audio_url"])
return audio_urls
# VISITOR Mode
urls = document_to_audio("handbuch.pdf")
print(f"Audio-Files: {len(urls)}") 1 Ordner scannen
2 Batch OCR
3 Text sammeln
4 CSV Export
Python
# Produktion: Mit Token | Test: Ohne Token (VISITOR Mode)
import requests
import os
import csv
from pathlib import Path
def batch_ocr_to_csv(folder_path, output_csv, token=None):
"""
Verarbeitet alle PDFs/Bilder in einem Ordner und exportiert nach CSV.
"""
headers = {"Authorization": f"Bearer {token}"} if token else {}
# Unterstützte Formate
extensions = {'.pdf', '.png', '.jpg', '.jpeg', '.tiff', '.webp'}
files = [f for f in Path(folder_path).iterdir()
if f.suffix.lower() in extensions]
results = []
for file_path in files:
print(f"Verarbeite: {file_path.name}")
# OCR Request
response = requests.post(
"https://api.paperoffice.ai/latest/job",
headers=headers,
files={"file_1": open(file_path, "rb")},
data={
"ocr_mode": "complete",
"priority": 900
}
)
result = response.json()["job_result"]
results.append({
"filename": file_path.name,
"pages": result.get("page_count", 1),
"text_length": len(result.get("text", "")),
"text_preview": result.get("text", "")[:500],
"confidence": result.get("confidence", 0)
})
# CSV Export
with open(output_csv, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=results[0].keys())
writer.writeheader()
writer.writerows(results)
print(f"✅ {len(results)} Dokumente → {output_csv}")
return results
# VISITOR Mode - kein Token nötig!
batch_ocr_to_csv("./documents", "ocr_results.csv")
# Mit Token für Produktion
batch_ocr_to_csv("./documents", "results.csv", "po_usr_...") 💡 전문가 팁
내부 지식
동기식 vs 비동기식
우선순위 >= 900 = 즉시 결과, 우선순위 < 900 = 작업 ID + 폴링
priority=900 → Sync | priority=100 → Async VISITOR 모드
토큰이 없나요? 문제 없습니다! bearer_token을 비워두세요.
Authorization: Bearer (leer) 바운딩 박스
AI-IDP-Antworten enthalten bbox für jedes Feld – perfekt für Verifizierungs-UI.
{"bbox": [x1, y1, x2, y2]} 최고의 음성
네이티브 음성이 가장 자연스럽습니다. 속도 1.0이 최적입니다.
voice=Nadja, speed=1.0 $ echo "Recipe copied?"
✓ Recipe copied!
$ echo "API Key ready?"
✓ VISITOR 모드 활성 (또는 자신의 키)
$ ./ship_it.sh
🚀 배포 준비 완료!