处理 XFDF 中的图像以进行 PDF 注释

问题描述 投票:0回答:1

我正在开发一个项目,我们需要使用 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>
pdf markup pdftron pspdfkit xfdf
1个回答
0
投票

外部化图像数据: 外部存储图像并使用 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)
© www.soinside.com 2019 - 2024. All rights reserved.