我正在开发一个项目,我们需要使用 XFDF 管理 PDF 注释。目前,注释中包含的图像被编码为 base64 字符串,这显着增加了 XFDF 数据的大小。这不仅会影响 Core Data 中的本地存储,还会影响从服务器获取数据时的数据传输。
我正在寻找更有效地管理这些图像的替代方案。具体来说,是否可以使用图像的 URL 而不是 base64 编码?因此,我可以将图像下载到本地文件系统中,并使用相应的注释来映射图像
还有其他处理 XFDF 中的图像数据的策略可以帮助减少存储和传输开销吗?任何建议或例子将不胜感激!
我希望使用 Apryse 或 PSPDFKit 进行 PDF 查看和标记渲染
<?xml version="1.0" encoding=""?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<pdf-info xmlns="http://www.pdftron.com/pdfinfo" version="2" import-version="4"></pdf-info>
<fields></fields>
<annots>
<stamp page="0" rect="321.521,562.931,508.2,611.931" flags="print" name="c6029306-80ff-32aa-52e9-827992c5e269" title="Guest" subject="Approved" date="D:20241104112145+05'30'" creationdate="D:20241104112142+05'30'" icon="Approved">
<trn-custom-data bytes="{"trn-annot-maintain-aspect-ratio":"true","trn-associated-number":"1","trn-unrotated-rect":"321.521,562.931,508.2,611.931"}"></trn-custom-data>
<imagedata>data:image/png;base64,/rQ7TFbu7Zmc...</imagedata>
</stamp>
</annots>
<pages>
<defmtx matrix="1,0,0,-1,0,792"></defmtx>
</pages>
</xfdf>
外部化图像数据: 外部存储图像并使用 XFDF 文件中的引用,从而仅在 XFDF 中保留图像链接。
压缩图像: 在编码为 Base64 之前,压缩图像以减小文件大小,这有助于减小整体 XFDF 大小。
优化Base64字符串: 对 base64 字符串使用压缩算法(如 gzip)以进一步减小其大小。
增量更新: 仅更新 XFDF 文件的更改部分,而不是在每次注释更改后完全重新创建它。
代码示例: 以下是处理外部图像存储和在 XFDF 中引用图像的示例:
import base64
from PIL import Image
import os
# Compress and save image
def save_compressed_image(image_path, output_path):
with Image.open(image_path) as img:
img.save(output_path, format='JPEG', quality=85)
# Externalize and encode image to base64
def image_to_base64_external(image_path):
compressed_image_path = os.path.splitext(image_path)[0] + "_compressed.jpg"
save_compressed_image(image_path, compressed_image_path)
with open(compressed_image_path, 'rb') as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
# Add image reference to XFDF
def add_image_annotation_to_xfdf(xfdf_path, image_base64_str, image_reference, output_path):
with open(xfdf_path, 'r') as file:
xfdf_data = file.read()
xfdf_with_reference = xfdf_data.replace('</xfdf>', f'<image src="{image_reference}">{image_base64_str}</image></xfdf>')
with open(output_path, 'w') as file:
file.write(xfdf_with_reference)
# Usage Example
image_path = "path/to/image.jpg"
image_base64_str = image_to_base64_external(image_path)
xfdf_path = "path/to/annotations.xfdf"
output_path = "path/to/output.xfdf"
add_image_annotation_to_xfdf(xfdf_path, image_base64_str, 'http://example.com/image.jpg', output_path)