You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否用Tesseract实现图片流式写入PDF?大文件场景需求

可行性与实现方案

该需求完全可行,主流PDF处理库均支持流式增量写入,无需缓存全部图片或生成临时文件,可直接按扫描顺序逐页追加图片到PDF。

Python 实现方案

方案1:使用 fpdf2 库

fpdf2 是轻量级PDF生成库,原生支持逐页添加图片,内存占用低,适配流式场景。

代码示例:

from fpdf import FPDF
import io

# 假设 scannerImages.next() 返回图片字节流或单张图片的临时输入源
pdf = FPDF()
with open("myPDFFileName.pdf", "wb") as output_stream:
    for image in scannerImages.next():
        pdf.add_page()
        # 处理字节流格式的图片
        if isinstance(image, bytes):
            img_io = io.BytesIO(image)
            pdf.image(img_io, w=pdf.w, h=pdf.h)  # 按页面尺寸自动适配
        # 处理单张图片的文件对象/临时路径
        else:
            pdf.image(image, w=pdf.w, h=pdf.h)
    # 输出到目标文件流
    pdf.output(output_stream)

后续OCR集成:在添加图片前,用 pytesseract 识别图片文本,通过 pdf.text() 方法将文本写入页面(可设置为透明样式,不遮挡图片同时支持文本搜索)。

方案2:使用 PyPDF2 库

PyPDF2 支持PDF的增量追加,可初始化空文档后逐页添加图片生成的单页PDF。

代码示例:

from PyPDF2 import PdfWriter, PdfReader
from PIL import Image
import io

writer = PdfWriter()

with open("myPDFFileName.pdf", "wb") as output_stream:
    for image in scannerImages.next():
        # 将单张图片转为临时单页PDF
        img = Image.open(io.BytesIO(image))
        temp_pdf = io.BytesIO()
        img.save(temp_pdf, format="PDF")
        temp_pdf.seek(0)
        # 追加到主文档并实时写入输出流
        reader = PdfReader(temp_pdf)
        writer.add_page(reader.pages[0])
        writer.write(output_stream)
        # 清理临时对象释放内存
        temp_pdf.close()
    writer.close()

Java 实现方案

方案1:使用 Apache PDFBox

PDFBox 支持流式创建PDF,逐页添加图片,适合大数量图片的低内存场景。

代码示例:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.FileOutputStream;
import java.io.InputStream;

public class StreamImageToPDF {
    public static void main(String[] args) throws Exception {
        try (PDDocument document = new PDDocument();
             FileOutputStream outputStream = new FileOutputStream("myPDFFileName.pdf")) {
            
            // 模拟 scannerImages.next() 返回的单张图片输入流
            while (scannerImages.hasNext()) {
                InputStream imageStream = scannerImages.next();
                PDPage page = new PDPage();
                document.addPage(page);
                
                PDImageXObject image = PDImageXObject.createFromByteArray(document, 
                    imageStream.readAllBytes(), "scanned-image");
                try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                    // 按页面尺寸缩放图片
                    contentStream.drawImage(image, 0, 0, page.getMediaBox().getWidth(), page.getMediaBox().getHeight());
                }
                // 增量写入输出流,避免内存堆积
                document.saveIncremental(outputStream);
                imageStream.close();
            }
        }
    }
}

方案2:使用 iText 7

iText 7 提供高效的流式PDF生成API,支持逐页追加图片,内存占用可控。

代码示例:

import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.io.image.ImageDataFactory;
import java.io.FileOutputStream;
import java.io.InputStream;

public class StreamImageToPDF {
    public static void main(String[] args) throws Exception {
        try (PdfWriter writer = new PdfWriter(new FileOutputStream("myPDFFileName.pdf"));
             PdfDocument pdfDoc = new PdfDocument(writer);
             Document document = new Document(pdfDoc)) {
            
            while (scannerImages.hasNext()) {
                InputStream imageStream = scannerImages.next();
                // 从输入流创建图片元素并适配页面宽度
                Image img = new Image(ImageDataFactory.create(imageStream.readAllBytes()));
                img.setWidth(pdfDoc.getDefaultPageSize().getWidth());
                document.add(img);
                // 强制刷新,释放内存缓存
                document.flush();
                imageStream.close();
            }
        }
    }
}

后续OCR集成说明

无论采用哪种语言方案,均可在添加图片到PDF前完成OCR识别:

  • Python:用 pytesseract 识别图片文本,将文本作为隐藏层添加到PDF页面(不影响图片显示,同时支持文本搜索)。
  • Java:用 tess4j(Tesseract的Java封装)识别文本,通过PDF库的文本API将文本写入页面透明层。

内容的提问来源于stack exchange,提问作者tlum

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:15:51