500 API 调用
每次通话费用约为 $0.050。积分永不过期。
- 一次性付款
- 任何计划的堆叠
- 每份文件一次调用
14,000+ trusted customers
适用于你已经搭建的地方
PDF4me 随时随地满足您的需求:您的浏览器、Microsoft Teams、Google Workspace、您的自动化平台或您自己的代码。
真实、可运行的示例,直接取自我们的开源示例。选择一个端点和一种语言,
复制整个文件并运行它。这就是全部的API。
const fs = require('fs');
const path = require('path');
/**
* Document to PDF Converter using PDF4Me API
* Converts various document formats (DOCX, XLSX, etc.) to PDF documents
* Supports both synchronous and asynchronous processing with retry logic
*/
// API Configuration - PDF4Me service for converting documents to PDF
const API_KEY = "get the API key from https://dev.pdf4me.com/dashboard/#/api-keys/";
const BASE_URL = "https://api.pdf4me.com/";
const API_ENDPOINT = `${BASE_URL}api/v2/ConvertToPdf`;
// File paths configuration
const INPUT_DOC_PATH = "sample.docx"; // Path to input document file
const OUTPUT_PDF_PATH = "Document_to_PDF_output.pdf"; // Output PDF file name
// Retry configuration for async processing
const MAX_RETRIES = 10;
const RETRY_DELAY = 10000; // 10 seconds in milliseconds
/**
* Main function that orchestrates the document to PDF conversion process
* Handles file validation, conversion, and result processing
*/
async function convertDocumentToPdf() {
console.log("Starting Document to PDF Conversion Process...");
console.log("This converts various document formats (DOCX, XLSX, etc.) to PDF");
console.log("Supports Word documents, Excel spreadsheets, and other formats");
console.log("-".repeat(60));
try {
// Validate input file exists
if (!fs.existsSync(INPUT_DOC_PATH)) {
throw new Error(`Input document file not found: ${INPUT_DOC_PATH}`);
}
console.log(`Converting: ${INPUT_DOC_PATH} → ${OUTPUT_PDF_PATH}`);
// Process the conversion
const result = await processDocumentToPdfConversion();
// Handle the result
await handleConversionResult(result);
} catch (error) {
console.error("Conversion failed:", error.message);
process.exit(1);
}
}
/**
* Core conversion logic - handles the API request and response processing
* Supports both synchronous (200) and asynchronous (202) responses
*/
async function processDocumentToPdfConversion() {
// Read and encode document file to base64
console.log("Reading and encoding document file...");
const docContent = fs.readFileSync(INPUT_DOC_PATH);
const docBase64 = docContent.toString('base64');
console.log("Document file successfully encoded to base64");
// Prepare the conversion payload
const payload = {
docContent: docBase64, // Base64 encoded document content
docName: "output", // Name for the output file
async: true // Enable asynchronous processing
};
// Set up HTTP headers for authentication and content type
const headers = {
"Authorization": `Basic ${API_KEY}`,
"Content-Type": "application/json"
};
console.log("Sending request to PDF4Me API...");
// Make the initial API request
const response = await fetch(API_ENDPOINT, {
method: 'POST',
headers: headers,
body: JSON.stringify(payload)
});
console.log(`Status code: ${response.status}`);
// Handle different response scenarios
if (response.status === 202) {
// Asynchronous processing - poll for completion
console.log("Request accepted. PDF4Me is processing asynchronously...");
const locationUrl = response.headers.get('Location');
if (!locationUrl) {
throw new Error("No 'Location' header found in the response for polling");
}
return await pollForCompletion(locationUrl, headers);
} else if (response.status === 200) {
// Synchronous processing - immediate result
console.log("Document to PDF conversion completed immediately!");
return await response.arrayBuffer();
} else {
// Error response
const errorText = await response.text();
throw new Error(`API request failed. Status: ${response.status}, Response: ${errorText}`);
}
}
/**
* Handles the conversion result and saves the PDF file
* Supports both binary PDF data and base64 encoded responses
*/
async function handleConversionResult(result) {
try {
// Convert ArrayBuffer to Buffer for file operations
const buffer = Buffer.from(result);
// Validate that we have a PDF (check for PDF header)
if (buffer.length > 4 && buffer.toString('ascii', 0, 4) === '%PDF') {
console.log("Response is a valid PDF file");
fs.writeFileSync(OUTPUT_PDF_PATH, buffer);
console.log(`PDF saved successfully to: ${OUTPUT_PDF_PATH}`);
console.log("Document has been converted to PDF format");
return;
}
// Try to parse as JSON if not a direct PDF
try {
const jsonResponse = JSON.parse(buffer.toString());
console.log("Successfully parsed JSON response");
// Look for PDF data in different possible JSON locations
let pdfBase64 = null;
if (jsonResponse.document && jsonResponse.document.docData) {
pdfBase64 = jsonResponse.document.docData; // Common location 1
} else if (jsonResponse.docData) {
pdfBase64 = jsonResponse.docData; // Common location 2
} else if (jsonResponse.data) {
pdfBase64 = jsonResponse.data; // Alternative location
}
if (pdfBase64) {
// Decode base64 PDF data and save to file
const pdfBytes = Buffer.from(pdfBase64, 'base64');
fs.writeFileSync(OUTPUT_PDF_PATH, pdfBytes);
console.log(`PDF saved to ${OUTPUT_PDF_PATH}`);
console.log("Document has been converted to PDF format");
} else {
console.log("No PDF data found in the response.");
console.log("Full response:", JSON.stringify(jsonResponse, null, 2));
}
} catch (jsonError) {
console.log("Failed to parse JSON response, treating as binary data");
// If JSON parsing fails, try to save as binary anyway
if (buffer.length > 1000) {
fs.writeFileSync(OUTPUT_PDF_PATH, buffer);
console.log(`PDF saved to ${OUTPUT_PDF_PATH} (as binary data)`);
console.log("Document has been converted to PDF format");
} else {
console.log("Warning: Response doesn't appear to be a valid PDF");
console.log(`First 100 bytes: ${buffer.toString('hex', 0, 100)}`);
}
}
} catch (error) {
throw new Error(`Error saving PDF: ${error.message}`);
}
}
/**
* Polls the API for async completion with retry logic
* Handles 202 (processing) and 200 (completed) status codes
*/
async function pollForCompletion(locationUrl, headers) {
console.log(`Polling URL: ${locationUrl}`);
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
console.log(`Waiting for result... (Attempt ${attempt}/${MAX_RETRIES})`);
// Wait before polling (except on first attempt)
if (attempt > 1) {
await new Promise(resolve => setTimeout(resolve, RETRY_DELAY));
}
try {
const response = await fetch(locationUrl, {
method: 'GET',
headers: headers
});
if (response.status === 200) {
// Conversion completed successfully
console.log("Document to PDF conversion completed successfully!");
return await response.arrayBuffer();
} else if (response.status === 202) {
// Still processing, continue polling
console.log("Still processing...");
continue;
} else {
// Error occurred during processing
const errorText = await response.text();
throw new Error(`Unexpected error during polling: ${response.status}, Response: ${errorText}`);
}
} catch (error) {
if (attempt === MAX_RETRIES) {
throw new Error(`Polling failed after ${MAX_RETRIES} attempts: ${error.message}`);
}
console.log(`Polling attempt ${attempt} failed: ${error.message}`);
}
}
throw new Error(`Timeout: Document to PDF conversion did not complete after ${MAX_RETRIES} retries`);
}
// Main execution - Run the conversion when script is executed directly
if (require.main === module) {
convertDocumentToPdf().catch(error => {
console.error("Fatal error:", error.message);
process.exit(1);
});
}
module.exports = { convertDocumentToPdf, processDocumentToPdfConversion, handleConversionResult }; 将 PDF4me 指向发票、收据、银行对账单或合同,即可获得结构化的 JSON 数据,可直接导入您的系统。无需维护此类文档的模板。

将 Word 或 HTML 模板与 JSON 合并,生成 PDF 或 Word 文件,可以一次生成一个,也可以批量生成。

生成 ZUGFeRD 混合电子发票,一个嵌入发票 XML 的 PDF/A-3 文件,符合德国 B2B 要求和任何 EN 16931 ERP 标准。

定义您自己的字段架构并提取您需要的内容,或者让 PDF4me 自动对混合批次进行分类,并按类型路由每个文档。

无需安装 Office,即可通过一个 API 将 Word 和 Excel 转换为 PDF,然后再转换回来,并合并、拆分、添加水印和密码保护 Office 文件。

生成并嵌入 QR、Code 128、Data Matrix 和 50 多种条形码类型,从 PDF 和图像中读取它们,或按条形码分隔符拆分文档批次。

隐私和安全是内置的,而非后期添加的。无论您是在浏览器中转换一个文件,还是通过 API 处理数百万个文件,瑞士公司 PDF4me 都采用相同的数据处理规则。
上传的文件在隔离的云存储中静态加密,然后通过在线工具在一小时内自动删除,或在 API 任务完成后几分钟内删除。分享链接会在 14 天后过期。我们只保留您明确保存到“我的文档”中的内容。
您的文档内容绝不会用于模型训练,无论是我们自己的还是其他任何机构的。AI 数据提取仅基于您在请求时定义的模式运行。我们不会挖掘、分析或转售您发送给我们的文件。
需要采购或 GDPR 审查所需的数据处理协议 (DPA)?下载 PDF4me 协议及其处理和安全附件。无需等待销售团队的回复,即可将其分享给法务部门。
所有浏览器上传、API 调用和下载都通过 HTTPS/TLS 传输。文件在处理过程中始终保持加密状态,租户间隔离,并且仅在作业期间保留在内存中。
我们正在实施正式的 ISO/IEC 27001 信息安全管理体系:文件化的策略、基于角色的访问控制、变更控制、事件响应和供应商监督,并计划在 2026 年进行独立审计。
一个平台即可满足日常 PDF 工具和生产环境 REST API 的需求,并提供 SDK、自动化连接器(Make、Zapier、Power Automate、n8n)和 MCP。无需自行构建 PDF 技术栈,即可将文档功能集成到您的产品中。
在浏览器中即可免费转换、编辑、合并、压缩、签名和进行OCR识别。无需安装,无需注册。
免费使用 API,然后充值永不过期的预付费套餐。一次性付款,无合约限制,所有套餐均可叠加到月度计划中。
每次通话费用约为 $0.050。积分永不过期。
每次通话费用约为 $0.045。积分永不过期。
每次通话费用约为 $0.038。积分永不过期。
每次通话费用约为 $0.036。积分永不过期。
每次通话费用约为 $0.033。积分永不过期。
每次通话费用约为 $0.026。积分永不过期。
需要比我们最大预付费套餐更多的选择?请联系销售部门,了解定制批量价格、计费条款和专属支持。
每个文档仅需一次 API 调用。高质量转换、OCR 和 AI 功能每页计为一次调用。需要包月套餐或免费套餐?所有信息都列在完整定价页面。
查看完整定价和 API 调用费用您可以使用 API 将其集成到您的产品中,无需编写代码即可实现自动化,或者使用浏览器中的免费工具。无需信用卡即可开始。
curl -X POST https://api.pdf4me.com/v1/ConvertToPdf免费版 · 无需信用卡