Lewati ke konten utama

14,000+ trusted customers

Alat PDF

Setiap alat PDF.
Online & gratis.

Konversikan, gabungkan, kompres, pisahkan, tanda tangani, dan edit PDF langsung di browser Anda. Tanpa instalasi, tanpa pendaftaran.

40+ alat yang berfungsi di perangkat apa pun.

Berfungsi di tempat Anda sudah membangun

Gunakan PDF4me di tempat kerja Anda.

PDF4me menemui Anda di mana pun Anda berada: peramban Anda, Microsoft Teams, Google Workspace, platform otomatisasi Anda, atau kode Anda sendiri.

Untuk pengembang

Dirancang untuk pengembang.

Contoh nyata yang dapat dijalankan langsung dari contoh sumber terbuka kami. Pilih titik akhir dan bahasa,
Salin seluruh file, lalu jalankan. Itulah keseluruhan API-nya.

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 }; 
  • 100Titik akhir API
  • 15Kategori API
  • 4Platform tanpa kode
  • 30+Alat online gratis
  • 4Ekstensi
Untuk pengembang

Hanya dengan satu klik
hingga satu juta panggilan API.

Ekstraksi data AI

Ubah faktur dan formulir menjadi data yang rapi.

Arahkan PDF4me ke faktur, kwitansi, laporan bank, atau kontrak dan dapatkan JSON terstruktur yang siap dimasukkan ke dalam sistem Anda. Tidak perlu mengelola templat untuk jenis dokumen ini.

  • Program pengurai siap pakai untuk faktur, kwitansi, laporan bank, slip gaji, kontrak, dan banyak lagi.
  • Kolom seperti vendor, item baris, total, tanggal, dan pajak, dikembalikan sebagai JSON.
  • Aksi bawaan di Power Automate, Make, dan n8n, ditambah mesin yang sama pada REST API.
Jelajahi ekstraksi data AI.
Pembuatan dokumen

Buat dokumen dari templat dan data.

Gabungkan templat Word atau HTML dengan JSON Anda untuk menghasilkan file PDF atau Word, satu per satu atau secara massal.

  • Word (.docx) dan templat HTML dengan variabel, tabel, dan gambar.
  • Pembuatan data tunggal atau massal dari catatan data JSON.
  • Tindakan generasi yang sama pada REST API, Power Automate, Make, n8n dan Zapier
Jelajahi pembuatan dokumen
Faktur elektronik

Kirim faktur elektronik ZUGFeRD dalam satu panggilan.

Hasilkan faktur elektronik hibrida ZUGFeRD, satu file PDF/A-3 dengan XML faktur yang tertanam di dalamnya, siap untuk mandat B2B Jerman dan ERP EN 16931 apa pun.

  • Hybrid PDF/A-3 + XML, selaras dengan EN 16931 dan Factur-X
  • Kesesuaian BASIC, COMFORT, dan EXTENDED, dari data XML, JSON, atau CSV.
  • Aksi bawaan di Power Automate, Make, n8n dan Zapier, ditambah API REST.
Jelajahi faktur ZUGFeRD
Uraikan & klasifikasikan

Buat parser untuk dokumen apa pun.

Tentukan skema bidang Anda sendiri dan ekstrak persis apa yang Anda butuhkan, atau biarkan PDF4me mengklasifikasikan kumpulan data campuran secara otomatis dan mengarahkan setiap dokumen berdasarkan jenisnya.

  • Uraikan ke skema JSON Anda sendiri, atau klasifikasikan secara otomatis berdasarkan jenis dokumen.
  • Templat penganalisis khusus, yang dibangun di dasbor pengembang.
  • Skor kepercayaan untuk mengarahkan kumpulan dokumen campuran.
Jelajahi parse & klasifikasi
Otomatisasi Word & Excel

Otomatiskan Word dan Excel dalam skala besar.

Konversikan Word dan Excel ke PDF dan sebaliknya, lalu gabungkan, pisahkan, beri watermark, dan lindungi file Office dengan kata sandi, semuanya dari satu API tanpa perlu instalasi Office.

  • Word ke PDF, Excel ke PDF, dan PDF kembali ke Word atau Excel
  • Menggabungkan, memisahkan, dan membandingkan file Word; menambahkan, memperbarui, dan mengekstrak baris Excel.
  • Beri tanda air dan lindungi file Word dan Excel dengan kata sandi.
Jelajahi Word & Excel
Kode batang

Membaca, membuat, dan memisahkan berdasarkan kode batang.

Hasilkan dan sematkan kode QR, Kode 128, Data Matrix, dan 50+ jenis kode batang lainnya, baca kembali kode tersebut dari PDF dan gambar, atau pisahkan kumpulan dokumen berdasarkan pemisah kode batang.

  • Buat dan sematkan lebih dari 50 jenis barcode, termasuk QR dan Data Matrix.
  • Membaca kode batang dan kode Swiss QR dari PDF dan gambar.
  • Tagihan Swiss QR dan EPC/SEPA, ditambah PDF terpisah berdasarkan kode batang
Jelajahi kode batang
Kepercayaan & keamanan

Dokumen Anda aman.

Privasi dan keamanan sudah terintegrasi, bukan sekadar tambahan. PDF4me, perusahaan milik Swiss, menerapkan aturan penanganan data yang sama, baik Anda mengonversi satu file di browser maupun memproses jutaan file melalui API.

File dihapus setelah diproses

Unggahan dienkripsi saat disimpan di penyimpanan cloud terisolasi, kemudian dihapus secara otomatis dalam waktu satu jam melalui alat daring, atau dalam hitungan menit setelah pekerjaan API selesai. Tautan berbagi akan kedaluwarsa setelah 14 hari. Kami hanya menyimpan apa yang Anda simpan secara eksplisit ke Dokumen Saya.

Tidak pernah digunakan untuk melatih AI.

Isi dokumen Anda tidak pernah disimpan untuk pelatihan model, baik model kami maupun model pihak lain. Ekstraksi AI hanya berjalan berdasarkan skema yang Anda tentukan pada saat permintaan. Kami tidak menambang, menganalisis, atau menjual kembali file yang Anda kirimkan kepada kami.

Perjanjian Pemrosesan Data

Butuh Perjanjian Pemrosesan Data (DPA) untuk pengadaan atau tinjauan GDPR? Unduh perjanjian PDF4me beserta lampiran pemrosesan dan keamanan. Bagikan dengan tim hukum tanpa perlu menunggu di thread penjualan.

Terenkripsi dari ujung ke ujung

Setiap unggahan browser, panggilan API, dan unduhan berjalan melalui HTTPS/TLS. Saat sebuah file ditahan untuk diproses, file tersebut tetap terenkripsi saat disimpan, terisolasi per penyewa, dan hanya disimpan di memori selama durasi pekerjaan.

ISO 27001 sedang berlangsungIn progress

Kami sedang menerapkan sistem manajemen keamanan informasi ISO/IEC 27001 formal: kebijakan terdokumentasi, akses berbasis peran, kontrol perubahan, respons insiden, dan pengawasan pemasok, dengan target audit independen pada tahun 2026.

Dirancang untuk produksi

Satu platform untuk alat PDF sehari-hari dan API REST produksi dengan SDK, konektor otomatisasi (Make, Zapier, Power Automate, n8n), dan MCP. Sertakan fitur dokumen dalam produk Anda tanpa perlu membangun tumpukan PDF sendiri.

Alat PDF

Semua alat PDF, hanya dengan satu klik.

Konversi, edit, gabungkan, kompres, tanda tangani, dan lakukan OCR, gratis di browser Anda. Tanpa instalasi, tanpa pendaftaran.

Jelajahi semua alat 33 Setiap alat di sini juga merupakan API.
Harga

Bayar hanya untuk apa yang Anda proses.

Mulai gratis dengan API, lalu isi ulang dengan paket prabayar yang tidak pernah kedaluwarsa. Pembayaran satu kali, tanpa ikatan kontrak, dan setiap paket dapat diakumulasikan dalam paket bulanan.

Untuk mencobanya
$25sekali

Panggilan API 500

Sekitar $0.050 per panggilan. Kredit tidak pernah kedaluwarsa.

  • Pembayaran satu kali
  • Dapat ditumpuk di semua paket
  • 1 panggilan per dokumen
Dapatkan paket 500
Untuk proyek kecil
$45sekali

Panggilan API 1,000

Sekitar $0.045 per panggilan. Kredit tidak pernah kedaluwarsa.

  • Pembayaran satu kali
  • Dapat ditumpuk di semua paket
  • 1 panggilan per dokumen
Dapatkan paket 1,000
Untuk otomatisasi lampu
$95sekali

Panggilan API 2,500

Sekitar $0.038 per panggilan. Kredit tidak pernah kedaluwarsa.

  • Pembayaran satu kali
  • Dapat ditumpuk di semua paket
  • 1 panggilan per dokumen
Dapatkan paket 2,500
Untuk tim yang sedang berkembang
$330sekali

Panggilan API 10,000

Sekitar $0.033 per panggilan. Kredit tidak pernah kedaluwarsa.

  • Pembayaran satu kali
  • Dapat ditumpuk di semua paket
  • 1 panggilan per dokumen
Dapatkan paket 10,000
Untuk volume tinggi
$650sekali

Panggilan API 25,000

Sekitar $0.026 per panggilan. Kredit tidak pernah kedaluwarsa.

  • Pembayaran satu kali
  • Dapat ditumpuk di semua paket
  • 1 panggilan per dokumen
Dapatkan paket 25,000
Untuk volume tinggi
Kebiasaanhubungi bagian penjualan

Lebih dari 25.000 panggilan API

Butuh lebih dari paket prabayar terbesar kami? Hubungi bagian penjualan untuk harga khusus berdasarkan volume, ketentuan penagihan, dan dukungan khusus.

  • Tersedia diskon pembelian dalam jumlah besar.
  • Dukungan akun khusus
  • Ketentuan penagihan yang fleksibel
Bicaralah dengan bagian penjualan

Satu panggilan API per dokumen. Konversi berkualitas tinggi, OCR, dan fitur AI dihitung sebagai satu panggilan per halaman. Butuh paket bulanan atau paket gratis? Semuanya ada di halaman harga lengkap.

Lihat harga lengkap dan biaya panggilan API.

Selesaikan dokumen Anda.

Integrasikan ke dalam produk Anda dengan API, otomatiskan tanpa perlu menulis kode, atau gunakan alat gratis di browser Anda. Tidak perlu kartu kredit untuk memulai.

Mulailah dengan satu panggilancurl -X POST https://api.pdf4me.com/v1/ConvertToPdf

Tingkat gratis · Tidak memerlukan kartu kredit