LOADING
import axios from 'axios'
import FormData from 'form-data'
import fs from 'fs'
import path from 'path'
const BASE = 'https://api.ilovepdf.com'
async function getPublicToken() {
const res = await axios.get('https://www.ilovepdf.com/pdf_to_jpg', {
headers: { 'User-Agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36' }
})
const match = res.data.match(/"token":"([^"]+)"/)
if (!match) throw new Error('Token not found')
return match[1]
}
async function startTask(token) {
// endpoint publik yang bener
const res = await axios.get(`${BASE}/v1/start/pdfjpg`, {
headers: { Authorization: `Bearer ${token}` }
})
// response: { server: 'api100.ilovepdf.com', task: 'xxx' }
return { server: `https://${res.data.server}`, task: res.data.task }
}
async function uploadFile(server, task, token, filePath) {
const form = new FormData()
form.append('task', task)
form.append('file', fs.createReadStream(filePath), path.basename(filePath))
const res = await axios.post(`${server}/v1/upload`, form, {
headers: { Authorization: `Bearer ${token}`, ...form.getHeaders() }
})
return res.data.server_filename
}
async function processTask(server, task, token, serverFilename, originalName, mode = 'pages', dpi = '150') {
const form = new FormData()
form.append('task', task)
form.append('tool', 'pdfjpg')
form.append('pdfjpg_mode', mode)
form.append('dpi', dpi)
form.append('output_filename', '{filename}_page')
form.append('packaged_filename', 'ilovepdf_pages-to-jpg')
form.append('files[0][server_filename]', serverFilename)
form.append('files[0][filename]', originalName)
await axios.post(`${server}/v1/process`, form, {
headers: { Authorization: `Bearer ${token}`, ...form.getHeaders() }
})
}
async function downloadResult(server, task, token, outputPath) {
const res = await axios.get(`${server}/v1/download/${task}`, {
headers: { Authorization: `Bearer ${token}` },
responseType: 'arraybuffer'
})
fs.writeFileSync(outputPath, res.data)
}
export async function pdfToJpg(filePath, outputPath = 'output.zip', { mode = 'pages', dpi = '150' } = {}) {
console.log('Fetching token...')
const token = await getPublicToken()
console.log('Starting task...')
const { server, task } = await startTask(token)
console.log(`Server: ${server}, Task: ${task}`)
console.log('Uploading...')
const serverFilename = await uploadFile(server, task, token, filePath)
console.log('Processing...')
await processTask(server, task, token, serverFilename, path.basename(filePath), mode, dpi)
console.log('Downloading...')
await downloadResult(server, task, token, outputPath)
console.log(`Done → ${outputPath}`)
}
pdfToJpg('./pdf.pdf', 'result.zip', { dpi: '300' })bashpdfToJpg('./dokumen.pdf', 'hasil.zip')
bashpdfToJpg('./dokumen.pdf', 'hasil.zip', { dpi: '300' })
bashpdfToJpg('./dokumen.pdf', 'hasil.zip', { mode: 'extract' })
bashpdfToJpg('./dokumen.pdf', 'hasil.zip', { mode: 'pages', dpi: '300' })
Hal yang bisa menyebabkan error:
- Ukuran PDF > 25MB (limit free user)
- Lebih dari 2 file sekaligus
- Kalau iLovePDF mengubah struktur HTML, token regex akan gagal. Solusinya cukup update regex yang digunakan.