PDF 检查员
快速的PDF分类,文本提取,以及Node.js/Bun的图像提取. 原始 Rust 表演通过 美洲狮。 。 。 .
由 纵火 对于混合式OCR管线——尽可能从PDF结构中取出文本,只有在需要时才返回OCR.
安装
npm install firecrawl-pdf-inspector
# or
bun add firecrawl-pdf-inspector
包含预建二进制 linux-x64, (中文(简体) ), linux- arm64 (英语), (中文(简体) ), 马科斯ARM64,以及 窗口-x64不需要拉链.
API 密码
processPdf(buffer: Buffer, pages?: number[]): PdfResult
完整的PDF处理——在一次呼叫中进行分类,取出文本并转换为Markdown.
import { processPdf } from 'firecrawl-pdf-inspector'
import { readFileSync } from 'fs'
const pdf = readFileSync('document.pdf')
const result = processPdf(pdf)
console.log(result.pdfType) // "TextBased" | "Scanned" | "Mixed" | "ImageBased"
console.log(result.markdown) // Markdown string or null
console.log(result.pageCount) // 42
classifyPdf(buffer: Buffer): PdfClassification
将 PDF 分类为基于文本、扫描、混合或基于图像(~10-50ms)。 返回需要OCR的页面.
import { classifyPdf } from 'firecrawl-pdf-inspector'
const result = classifyPdf(readFileSync('document.pdf'))
console.log(result.pdfType) // "TextBased" | "Scanned" | "Mixed" | "ImageBased"
console.log(result.pageCount) // 42
console.log(result.pagesNeedingOcr) // [5, 12, 15] (0-indexed)
console.log(result.confidence) // 0.875
processPdfWithImages(buffer: Buffer, pages?: number[]): PdfResultWithImages
处理一个 PDF 并在一个呼叫中同时提取标记和图像 。 降标包含  占位符位于何处 N 是返回的索引 images 阵列.
import { processPdfWithImages } from 'firecrawl-pdf-inspector'
import { readFileSync } from 'fs'
const result = processPdfWithImages(readFileSync('document.pdf'))
console.log(result.images.length) // 110
console.log(result.markdown) // "# Title\n\n\n\nSome text..."
// Replace placeholders with real URLs after uploading
let content = result.markdown
for (let i = 0; i < result.images.length; i++) {
const img = result.images[i]
const ext = img.format === 'Jpeg' ? 'jpg' : 'png'
const url = await uploadImage(img.data, `image-${i}.${ext}`)
content = content.replace(`pdf-image://${i}`, url)
}
extractImages(buffer: Buffer): ExtractedImage[]
从 PDF 提取嵌入式图像为原始字节 。 支持JPEG(DCTDecode)和PNG(FlateDecode)图像. 返回带有页面位置和尺寸的图像数据.
图像提取是一个与文本提取独立的函数——调用 processPdf 或者说 extractText 已经 没有 支付图像解压/编码的费用.
import { extractImages } from 'firecrawl-pdf-inspector'
import { writeFileSync } from 'fs'
const images = extractImages(readFileSync('document.pdf'))
for (const img of images) {
const ext = img.format === 'Jpeg' ? 'jpg' : 'png'
writeFileSync(`page${img.page}_${img.width}x${img.height}.${ext}`, img.data)
console.log(`Page ${img.page}: ${img.width}x${img.height} ${img.format}`)
}
extractTextInRegions(buffer: Buffer, pageRegions: PageRegions[]): PageRegionTexts[]
从 PDF 从边框区域中提取文本。 为混合式OCR管道所设计,其中布局模型在渲染的页面图像中检测出区域,而此函数从PDF结构中提取出文本用于基于文本的页面——跳过GPU OCR.
每个区域的成果包括: needsOcr 表示不可靠提取的旗帜(空文本、GID编码字体、垃圾文本、编码问题).
import { extractTextInRegions } from 'firecrawl-pdf-inspector'
const result = extractTextInRegions(pdf, [
{
page: 0, // 0-indexed
regions: [
[0, 0, 300, 400], // [x1, y1, x2, y2] in PDF points, top-left origin
[300, 0, 612, 400],
]
}
])
for (const region of result[0].regions) {
if (region.needsOcr) {
// Unreliable text — send this region to OCR instead
} else {
console.log(region.text) // Extracted text in reading order
}
}
extractText(buffer: Buffer): string
从 PDF 中提取纯文本 .
import { extractText } from 'firecrawl-pdf-inspector'
const text = extractText(readFileSync('document.pdf'))
类型
interface PdfResult {
pdfType: string // "TextBased" | "Scanned" | "Mixed" | "ImageBased"
markdown: string | null // Markdown output
pageCount: number
processingTimeMs: number
pagesNeedingOcr: number[] // 1-indexed page numbers
title: string | null
confidence: number // 0.0 - 1.0
isComplexLayout: boolean
pagesWithTables: number[]
pagesWithColumns: number[]
hasEncodingIssues: boolean
}
// Extends PdfResult with extracted images
interface PdfResultWithImages extends PdfResult {
images: ExtractedImage[] // Indices match pdf-image://N placeholders in markdown
}
interface PdfClassification {
pdfType: string // "TextBased" | "Scanned" | "Mixed" | "ImageBased"
pageCount: number
pagesNeedingOcr: number[] // 0-indexed page numbers
confidence: number // 0.0 - 1.0
}
interface ExtractedImage {
page: number // 1-indexed page number
x: number // X position on page
y: number // Y position on page
width: number // Pixel width
height: number // Pixel height
format: string // "Jpeg" | "Png"
data: Buffer // Raw image bytes (valid JPEG or PNG file)
}
interface PageRegions {
page: number // 0-indexed
regions: number[][] // [[x1, y1, x2, y2], ...] in PDF points, top-left origin
}
interface PageRegionTexts {
page: number
regions: RegionText[]
}
interface RegionText {
text: string
needsOcr: boolean // true when text is unreliable
}
支持的图像格式
| PDF 过滤器 | 输出格式 | 状态 |
|---|---|---|
| DCTD编码 | JPEG 组合 | 支助 |
| 节点 | 巴布亚新几内亚 | 支助 |
| JPX 十进制 | JPEG 2000 主题 | 计划 |
| CCITTFax十进制 | TIFF 时长 | 计划 |
颜色空格 : 设备RGB,设备Gray,设备CMYK(被转换为RGB),索引,ICC Based,CalRGB,CalGray.
说明: 矢量图形(用 PDF 路径操作符绘制)不是光栅图像,不能被取出——它们需要渲染.
业绩
文本提取和图像提取是独立的路径. processPdf 财务报告和审定财务报表 extractText 全部跳过图像处理, 所以当您只需要文本时, 上面是零 .
平台
| 平台 | 建筑 | 支助 |
|---|---|---|
| 链接 | x64 (韩语) | 对 |
| 链接 | 阿尔马-64 | 对 |
| 马科斯 | 阿尔马-64 | 对 |
| 窗口 | x64 (韩语) | 对 |
许可证
麻省理工学院