如何在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
相关产品推荐
相关产品推荐

