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

如何在TypeScript中实现Base64编码PDF的颜色反转?

可以通过编程实现PDF负色转换

当然可以。核心流程分为Base64解码PDF、解析并修改PDF内容的颜色、**重新编码为Base64(可选)**三个步骤。下面以Python为例,给出具体实现方案:

步骤1:Base64解码PDF

首先将Base64编码的字符串解码为PDF二进制数据:

import base64

# 假设base64_str是你的Base64编码PDF字符串
pdf_bytes = base64.b64decode(base64_str)

步骤2:使用PyMuPDF处理PDF负色转换

PyMuPDF(fitz)是处理PDF的高效库,能分别处理文本、矢量图形和图片的颜色反转:

完整代码示例

import base64
import fitz
from PIL import Image, ImageOps
import io

def invert_pdf_base64(base64_str):
    # 解码Base64
    pdf_bytes = base64.b64decode(base64_str)
    doc = fitz.open("pdf", pdf_bytes)

    for page in doc:
        # 1. 处理矢量图形的颜色
        drawings = page.get_drawings()
        for draw_obj in drawings:
            # 反转填充色
            if draw_obj["fill"] is not None:
                draw_obj["fill"] = tuple(255 - c for c in draw_obj["fill"])
            # 反转描边色
            if draw_obj["stroke"] is not None:
                draw_obj["stroke"] = tuple(255 - c for c in draw_obj["stroke"])
        # 重新绘制图形
        page.clean_contents()
        page.draw_drawings(drawings)

        # 2. 处理文本颜色
        text_dict = page.get_text("dict")
        for block in text_dict["blocks"]:
            if block["type"] == 0:  # 仅处理文本块
                for line in block["lines"]:
                    for span in line["spans"]:
                        # 将整数颜色值转为RGB
                        color_int = span["color"]
                        r = (color_int >> 16) & 0xFF
                        g = (color_int >> 8) & 0xFF
                        b = color_int & 0xFF
                        # 反转颜色并转回整数
                        inverted_color = (255 - r) << 16 | (255 - g) << 8 | (255 - b)
                        span["color"] = inverted_color
        # 更新页面文本
        page.set_text(text_dict)

        # 3. 处理页面中的图片
        image_list = page.get_images(full=True)
        for img_info in image_list:
            xref = img_info[0]
            # 提取图片数据
            img_data = doc.extract_image(xref)["image"]
            img = Image.open(io.BytesIO(img_data))
            # 反转图片颜色
            inverted_img = ImageOps.invert(img)
            # 保存回字节流
            img_buffer = io.BytesIO()
            inverted_img.save(img_buffer, format=img.format)
            img_buffer.seek(0)
            # 替换PDF中的原图片
            doc.update_image(xref, img_buffer.getvalue())

    # 导出修改后的PDF字节数据
    modified_pdf_bytes = doc.tobytes()
    doc.close()

    # 可选:重新编码为Base64
    modified_base64 = base64.b64encode(modified_pdf_bytes).decode("utf-8")
    return modified_base64

关键注意事项

  • 加密PDF:如果原PDF是加密的,需要先调用doc.authenticate("password")解密后再处理。
  • 复杂PDF结构:部分PDF可能包含内嵌的表单、注释或特殊字体,这类元素的颜色反转需要额外针对性处理。
  • 性能:处理大尺寸或多页PDF时,建议分页批量处理,避免内存占用过高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:09:32