Convert plain text content to PDF documents. This endpoint is ideal for generating PDFs from log files, code snippets, markdown content, or any plain text that needs to be preserved with its original formatting.
Endpoint
POST /textToPdf
Authentication
Requires a valid API key or OAuth token in the Authorization header:
Authorization: Bearer YOUR_API_KEY
See Authentication for details.
Request Body
Content-Type: application/json or multipart/form-data
| Field | Type | Required | Description |
|---|---|---|---|
text | string | Yes | Plain text content to convert to PDF |
font_size | integer | No | Font size in points (default: 12) |
filename | string | No | Output filename (default: document.pdf) |
storage | object | No | Storage options for the generated PDF (see below) |
return_binary | boolean | No | Return PDF binary even when using storage (default: false) |
Field Details
text (required)
The plain text content to render as a PDF. The text is rendered with:
- Monospace font (Courier New) for consistent character width
- 1.5 line height for readability
- Whitespace preservation (
white-space: pre-wrap) - 2cm page margins
- Automatic HTML entity escaping (
<,>,&)
font_size (optional)
The font size in points for the text content. If not provided, defaults to 12. Common sizes:
10- Compact, good for code or logs12- Standard (default)14- Larger, better readability
filename (optional)
The filename for the downloaded PDF. If not provided, defaults to document.pdf. The .pdf extension is automatically appended if not present.
Storage Options
Control how the generated PDF is stored and returned.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
storage.mode | string | No | memory | Storage mode: memory, default, or byob |
storage.filename | string | No | endpoint default | Custom filename (auto-suffixed with timestamp if duplicate) |
storage.expires_in | integer | No | 3600 | Signed URL expiry in seconds (60-604800) |
storage.retention_days | integer | No | 14 | Auto-delete document after N days (1-365) |
Storage Modes:
- memory: Return PDF bytes directly in response (no persistence). This is the default for REST API calls.
- default: Store in pdf-mcp S3 bucket, return JSON with document metadata and signed URL.
- byob: Store in your own S3 bucket (requires BYOB configuration).
Example Request
Basic Text Conversion (JSON)
curl -X POST https://api.pdf-mcp.io/textToPdf \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Hello, World!\n\nThis is a plain text document.\nLine breaks are preserved."
}' \
--output document.pdf
Code Snippet with Custom Font Size
curl -X POST https://api.pdf-mcp.io/textToPdf \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "function greet(name) {\n console.log(\"Hello, \" + name);\n}\n\ngreet(\"World\");",
"font_size": 10,
"filename": "code-snippet.pdf"
}' \
--output code-snippet.pdf
Log File Export
curl -X POST https://api.pdf-mcp.io/textToPdf \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "[2024-01-15 10:30:00] INFO Server started\n[2024-01-15 10:30:01] INFO Connected to database\n[2024-01-15 10:30:02] WARN Cache miss for key: user_123",
"font_size": 10,
"filename": "server-logs.pdf"
}' \
--output server-logs.pdf
Using Form Data
curl -X POST https://api.pdf-mcp.io/textToPdf \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "text=This is plain text content sent via form data." \
-F "font_size=12" \
-F "filename=form-output.pdf" \
--output form-output.pdf
With Storage (Persistent PDF)
curl -X POST https://api.pdf-mcp.io/textToPdf \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Server Log Export\n\n[2024-01-15 10:30:00] INFO Server started\n[2024-01-15 10:30:01] INFO Connected to database",
"font_size": 10,
"storage": {
"mode": "default",
"filename": "server-logs.pdf",
"expires_in": 86400,
"retention_days": 30
}
}'
Response
Success (memory mode)
When storage.mode is memory or not provided, returns the PDF as a binary file download.
Headers:
Content-Type: application/pdf
Content-Disposition: attachment; filename="document.pdf"
Success (with storage)
When storage.mode is default or byob, returns JSON with document metadata and a signed download URL:
{
"success": true,
"document_id": "550e8400-e29b-41d4-a716-446655440000",
"url": "https://s3.eu-central-1.amazonaws.com/...",
"filename": "server-logs.pdf",
"file_size_bytes": 12345,
"page_count": 1,
"storage_mode": "default",
"expires_at": "2024-02-15T10:30:00Z",
"signed_url_expires_at": "2024-01-16T10:30:00Z"
}
| Field | Type | Description |
|---|---|---|
success | boolean | Always true on success |
document_id | string | UUID of the stored document |
url | string | Presigned URL for downloading the PDF |
filename | string | Document filename |
file_size_bytes | integer | Size of the PDF in bytes |
page_count | integer | Number of pages in the PDF |
storage_mode | string | Storage mode used (default or byob) |
expires_at | string | Auto-deletion timestamp (ISO 8601), if retention is set |
signed_url_expires_at | string | Expiration time of the signed URL (ISO 8601) |
Error
{
"error": "Failed to convert text to PDF",
"message": "Error description"
}
Status Codes:
| Code | Description |
|---|---|
| 200 | Success - PDF returned or stored |
| 400 | Bad Request - Invalid input or BYOB not configured |
| 401 | Unauthorized - Missing or invalid Authorization header |
| 402 | Payment Required - Insufficient credits |
| 403 | Forbidden - Invalid API key or OAuth token |
| 500 | Internal Server Error - PDF generation failed |
| 502 | Bad Gateway - Storage operation failed (S3 upload or URL generation) |
Output Formatting
The generated PDF uses the following default styling:
body {
font-family: 'Courier New', Courier, monospace;
font-size: 12pt; /* or your specified font_size */
line-height: 1.5;
white-space: pre-wrap;
margin: 2cm;
}
Whitespace Handling
- Line breaks: Preserved (
\ncreates new lines) - Spaces: Multiple spaces are preserved
- Tabs: Rendered as spaces
- Long lines: Wrap to fit page width
Character Escaping
HTML special characters are automatically escaped:
<becomes<>becomes>&becomes&
This ensures your text is rendered exactly as provided, even if it contains HTML-like content.
Use Cases
Code Documentation
curl -X POST https://api.pdf-mcp.io/textToPdf \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "# API Reference\n\n## Endpoints\n\nGET /users\nPOST /users\nGET /users/:id\nPUT /users/:id",
"font_size": 11,
"filename": "api-reference.pdf"
}' \
--output api-reference.pdf
Data Export
curl -X POST https://api.pdf-mcp.io/textToPdf \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"text": "Name Email Status\n--------------------------------------------------\nJohn Doe john@example.com Active\nJane Smith jane@example.com Pending",
"font_size": 10,
"filename": "users-export.pdf"
}' \
--output users-export.pdf
Example: Python Integration
import requests
API_KEY = "YOUR_API_KEY"
API_URL = "https://api.pdf-mcp.io/textToPdf"
response = requests.post(
API_URL,
headers={
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json"
},
json={
"text": "Hello from Python!\n\nThis text document was generated via the API.",
"font_size": 12,
"filename": "python-output.pdf"
}
)
if response.status_code == 200:
with open("output.pdf", "wb") as f:
f.write(response.content)
print("PDF saved successfully!")
else:
print(f"Error: {response.status_code}")
Example: Node.js Integration
const fs = require('fs');
const API_KEY = 'YOUR_API_KEY';
const API_URL = 'https://api.pdf-mcp.io/textToPdf';
async function generatePdf() {
const response = await fetch(API_URL, {
method: 'POST',
headers: {
'Authorization': `Bearer ${API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
text: 'Hello from Node.js!\n\nThis text document was generated via the API.',
font_size: 12,
filename: 'nodejs-output.pdf'
})
});
if (response.ok) {
const buffer = await response.arrayBuffer();
fs.writeFileSync('output.pdf', Buffer.from(buffer));
console.log('PDF saved successfully!');
} else {
console.error('Error:', response.status);
}
}
generatePdf();
Tips and Best Practices
Content Preparation
- Use
\nfor line breaks in your text - For multi-line strings in programming languages, use raw strings or template literals
- Escape JSON special characters properly when embedding in curl commands
Font Size Selection
- Use smaller fonts (
10pt) for dense content like logs or code - Use larger fonts (
14pt) for documents meant to be printed or read on paper - Test with a sample to find the right balance for your content
Page Layout
- Text wraps automatically at page margins
- Very long single lines will wrap to fit
- Consider breaking long content into logical sections with blank lines
Related Endpoints
- HTML to PDF - Convert HTML with full styling control
- Image to PDF - Convert images to PDF
- Merge PDFs - Combine multiple PDFs
Credit Usage
Approximately 1 credit per page generated.