PDF之OCProperties

PDF图层信息处理与OCProperties解析

  PDF根目录下有个字典OCProperties,这里保存了图层信息,在《PDF的图层处理笔记》里面我已经提到过PDFium的处理渲染的问题,但是PDFium将PDF拆分单页PDF后就会丢失OCProperties的信息。于是就有了今天的笔记。

其中OCProperties包含OCGs(映射集合或称为引用集合)和D(配置字典),在页面中标识OCG属性的映射一般是在页面属性下“/Resources/Properties/...”

 图中的Pr12,Pr104,Pr105实际上是Reference类型(映射),指向的实体类型是字典,Reference类型无法直接和OCProperties产生联系,但是有一个顺序表是一一对应的。所有的包含OC的Reference都是按顺序在OCGs下排列好的。想要知道顺序,完全可以先取得页面OC的顺序,然后在OCGs里面找到对应的字典引用,再通过引用在ON或OFF两个表单上查询。这样可以简单判断Pr12这些实体隐藏与否。

以下代码生成的pd文件fwindows预览有显示文字,用Adobe打开时不显示 import pikepdf from pikepdf import Name, Dictionary import os vector_pdf_path = "G:/compass/imageConvert/image/images/c/aaa.pdf" output_pdf_path = "G:/compass/imageConvert/image/images/c/aaa_modified.pdf" # 新的输出路径 def convertPdf(vector_pdf_path, output_pdf_path): # 打开原始PDF文件 pdf = pikepdf.open(vector_pdf_path, allow_overwriting_input=True) page = pdf.pages[0] # 创建OCG (Optional Content Group) 图层 ocg_dict = pikepdf.Dictionary({ '/Type': pikepdf.Name('/OCG'), '/Name': 'MyLayer', '/Intent': pikepdf.Name('/View') }) ocg = pdf.make_indirect(ocg_dict) # 添加图层属性,确保图层的可见性 pdf.Root['/OCProperties'] = { '/OCGs': [ocg], # 只添加这个图层 '/D': { '/Order': [ocg], # 图层顺序 '/OFF': [], # 默认关闭 '/AS': [ocg], # 图层显示 '/RBGroups': [], '/Locked': [] } } try: # 创建文本流 # 使用内置的 Helvetica 字体,确保文本能正确显示 new_content_stream_bytes = ( b"q\n" # 保存图层状态 b"/F1 12 Tf 100 700 Td (Hello, Layer!) Tj\n" # 设置字体、大小和文本内容 b"Q\n" # 恢复图层状态 ) # 将新的内容流包裹在图层控制的标记中 wrapped_stream_bytes = ( b"q\n" # 保存图层状态 b"/OC " + str(ocg).encode('utf-8') + b" BDC\n" # 设置图层 + new_content_stream_bytes # 新的文本内容流 + b"\nEMC\n" # 结束图层区域 + b"Q\n" # 恢复图层状态 ) # 创建新的内容流,包含新文本内容 wrapped_stream = pikepdf.Stream(pdf, wrapped_stream_bytes) # 替换页面中的内容流,完全用新的内容流替代 page[Name('/Contents')] = wrapped_stream # 保存到新的PDF文件 if os.path.exists(output_pdf_path): os.remove(output_pdf_path) # 如果文件存在,先删除 pdf.save(output_pdf_path) print(f"PDF 保存成功:{output_pdf_path}") except Exception as e: print("PDF 内容流处理失败:") print(f"错误信息: {str(e)}") # 调用函数,将结果保存到新的PDF文件 convertPdf(vector_pdf_path, output_pdf_path)
最新发布
11-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值