API 요청
/rest/pdf_to_image요청 파라미터 1개 · 필수 1
pdf응답 필드 파일
정상 응답은 파일 본문입니다. 실패 시 JSON 오류가 올 수 있으므로 HTTP 상태와 Content-Type을 먼저 확인하세요.
PDF 파일 한 개를 올리면 페이지마다 PNG 이미지로 바꿔 ZIP 파일 하나로 돌려줍니다. 응답은 JSON이 아닌 ZIP 파일입니다.
https://apick.app/rest/pdf_to_image왜 PDF 파일 이미지 변환인가
PDF 뷰어가 없는 화면이나 메신저에서는 문서 미리보기가 깨지고 고객은 열어보지도 않습니다. PDF 페이지를 이미지로 변환해 어떤 화면에서도 바로 보여줄 수 있습니다.
REQUEST_TOO_LARGE 오류가 반환되며 과금되지 않습니다.
PDF 문서를 웹·앱에서 미리보기 이미지로 보여 주거나, 페이지별 썸네일을 만들 때 사용합니다.
PDF 형식만 받습니다. 결과 ZIP 안에는 페이지 순서대로 pdf_image1.png, pdf_image2.png … 파일이 들어 있습니다. 이미지는 원본 페이지 크기의 2배 해상도로 만들어집니다.
요금은 변환한 페이지당 2P입니다(10페이지 PDF는 페이지당 요금 × 10). 실패·시간 초과 응답은 과금되지 않습니다.
/rest/pdf_to_imagepdf정상 응답은 파일 본문입니다. 실패 시 JSON 오류가 올 수 있으므로 HTTP 상태와 Content-Type을 먼저 확인하세요.
POST https://apick.app/rest/pdf_to_imageAuthorization: Bearer 내 계정의 API 인증키multipart/form-data상황별로 보내는 값과 응답에서 확인할 값을 모았습니다. 언어 탭에서 그대로 복사해 쓸 수 있습니다.
문서 미리보기용 이미지를 페이지마다 만듭니다.
/rest/pdf_to_imagecurl --fail-with-body --request POST 'https://apick.app/rest/pdf_to_image' \
--header "Authorization: Bearer $APICK_API_KEY" \
--form 'pdf=@./brochure.pdf' \
--dump-header response.headers --output result.zip
# response.headers의 Content-Type을 확인한 뒤 파일을 사용하세요.import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("pdf", new Blob([await readFile("./brochure.pdf")]), "brochure.pdf");
const response = await fetch("https://apick.app/rest/pdf_to_image", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
body: form,
signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
if ((response.headers.get("content-type") || "").includes("json")) {
throw new Error(JSON.stringify(await response.json()));
}
const { writeFile } = await import("node:fs/promises");
await writeFile("result.zip", new Uint8Array(await response.arrayBuffer()));import os
import requests
parts = [
("pdf", ("brochure.pdf", open("./brochure.pdf", "rb"))),
]
response = requests.request("POST", "https://apick.app/rest/pdf_to_image",
headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
files=parts,
timeout=(10, 120), stream=True)
response.raise_for_status()
if "json" in response.headers.get("Content-Type", ""):
raise RuntimeError(response.json())
with open("result.zip", "wb") as output:
for chunk in response.iter_content(65536):
output.write(chunk)<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
'pdf' => new CURLFile('./brochure.pdf'),
];
$curl = curl_init('https://apick.app/rest/pdf_to_image');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $form,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE) ?: "";
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
if (strpos($type, "json") !== false) { throw new RuntimeException($body); }
file_put_contents('result.zip', $body);Content-Type이 application/zip이면 output.zip으로 저장합니다.pdf_image1.png, pdf_image2.png … 번호가 페이지 순서입니다.표지 썸네일처럼 한 페이지만 필요하면 그 페이지만 담은 PDF를 보내 요금을 줄입니다. 요금은 페이지당입니다.
/rest/pdf_to_imagecurl --fail-with-body --request POST 'https://apick.app/rest/pdf_to_image' \
--header "Authorization: Bearer $APICK_API_KEY" \
--form 'pdf=@./cover_page.pdf' \
--dump-header response.headers --output result.zip
# response.headers의 Content-Type을 확인한 뒤 파일을 사용하세요.import { readFile } from "node:fs/promises";
const form = new FormData();
form.append("pdf", new Blob([await readFile("./cover_page.pdf")]), "cover_page.pdf");
const response = await fetch("https://apick.app/rest/pdf_to_image", {
method: "POST",
headers: { Authorization: "Bearer " + process.env.APICK_API_KEY },
body: form,
signal: AbortSignal.timeout(120_000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}: ${await response.text()}`);
if ((response.headers.get("content-type") || "").includes("json")) {
throw new Error(JSON.stringify(await response.json()));
}
const { writeFile } = await import("node:fs/promises");
await writeFile("result.zip", new Uint8Array(await response.arrayBuffer()));import os
import requests
parts = [
("pdf", ("cover_page.pdf", open("./cover_page.pdf", "rb"))),
]
response = requests.request("POST", "https://apick.app/rest/pdf_to_image",
headers={"Authorization": "Bearer " + os.environ["APICK_API_KEY"]},
files=parts,
timeout=(10, 120), stream=True)
response.raise_for_status()
if "json" in response.headers.get("Content-Type", ""):
raise RuntimeError(response.json())
with open("result.zip", "wb") as output:
for chunk in response.iter_content(65536):
output.write(chunk)<?php
$headers = ["Authorization: Bearer " . getenv("APICK_API_KEY")];
$form = [
'pdf' => new CURLFile('./cover_page.pdf'),
];
$curl = curl_init('https://apick.app/rest/pdf_to_image');
curl_setopt_array($curl, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_HTTPHEADER => $headers,
CURLOPT_POSTFIELDS => $form,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 10, CURLOPT_TIMEOUT => 120,
]);
$body = curl_exec($curl);
if ($body === false) { throw new RuntimeException(curl_error($curl)); }
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$type = curl_getinfo($curl, CURLINFO_CONTENT_TYPE) ?: "";
curl_close($curl);
if ($status >= 400) { throw new RuntimeException($body); }
if (strpos($type, "json") !== false) { throw new RuntimeException($body); }
file_put_contents('result.zip', $body);pdf_image1.png 한 장이 들어 있습니다.HTTP 성공과 업무 결과를 구분하세요. 경로별 응답 필드와 예시는 위 요청과 응답에 함께 있습니다.
성공하면 ZIP 본문이 바로 옵니다. 내려받기 파일명은 output.zip입니다. 압축을 풀어 파일 이름의 숫자 순서로 페이지를 정렬하세요.
ZIP은 변환하면서 이어서 전송됩니다. 내려받은 ZIP이 열리지 않으면 전송 중 실패한 것이므로 같은 파일로 다시 요청하세요.
1이면 변환을 시작해 ZIP을 보내는 중입니다.application/zip응답을 아래 순서로 확인하세요. 결과 유무와 과금 여부는 서로 다릅니다.
실패하면 ZIP 대신 JSON이 옵니다. HTTP 상태와 Content-Type을 먼저 확인하고, JSON이면 data.error 문구를 기록하세요. 실패 응답의 api.cost는 0입니다.
pdf로 보냈는지 확인하세요.data.success가 3입니다. 페이지를 나눠 다시 요청하세요.FORM_DATA_INVALIDFORM_DATA_FIELD_CONFLICTMULTIPART_LIMIT_OR_PARSE_ERROR실제 차감 금액은 응답의 api.cost로 확인하세요. 상세 요금은 요금정책에서 볼 수 있습니다.
같은 요청을 JavaScript와 Python으로 옮긴 예시입니다. 키는 환경변수 APICK_API_KEY 에서 읽습니다.