​​BTW文件信息解析:Python提取BarTender模板版本号​

条码老陈09-20139阅读0评论

      在日常处理BarTender模板文件(BTW文件)时经常遇到这样的困扰:客户发来的BTW文件版本各不相同我用高版本导出后有时客户版本较低无法正常打开;因此每次都需要手动反复查看文件属性、尝试用不同版本软件导出,耗费大量时间。快速准确地获知一个BTW文件的版本信息,是选择正确BarTender版本打开它、或进行相应兼容性处理的关键第一步。BTW 文件虽然本质上是二进制文件,但其头部通常包含有可读的文本信息。我们可以通过读取文件的前一定字节来获取这些信息,并尝试解码。

       以下是使用 Python 实现这读取BTW文件信息的核心方法及步骤:


      1.读取BTW文件头信息

       

from pathlib import Path

def read_head_text(file_path: Path, max_bytes: int = 128 * 1024) -> str:
    """读取BTW文件头部文本内容"""
    data = file_path.read_bytes()[:max_bytes]  # 读取前128KB内容
    try:
        return data.decode("utf-8")  # 尝试UTF-8解码
    except UnicodeDecodeError:
        return data.decode("latin-1", errors="ignore")  # 失败则尝试Latin-1解码



       2. 解析头部文本信息

import re

def parse_btw_header(text: str) -> dict:
    """解析BTW文件头部信息"""
    result = {
        "application_version": None,
        "application_build": None,
        "application_edition": None,
        "document_compatible_version": None,
        "metadata_application": None,
        "metadata_template_size": None,
        "metadata_title": None,
    }

    #解析Application行信息
    app_line_match = re.search(r"^Application:\s*(.+)$", text, re.MULTILINE)
    if app_line_match:
        app_line = app_line_match.group(1)
        # 使用正则表达式从Application行中提取版本、构建号和版本类型
        version_match = re.search(r"Version=([^;]+)", app_line)
        if version_match:
            result["application_version"] = version_match.group(1).strip()
        build_match = re.search(r"Build=([^;]+)", app_line)
        if build_match:
            result["application_build"] = build_match.group(1).strip()
        edition_match = re.search(r"Edition=([^;]+)", app_line)
        if edition_match:
            result["application_edition"] = edition_match.group(1).strip()

    #解析Document行信息
    doc_line_match = re.search(r"^Document:\s*(.+)$", text, re.MULTILINE)
    if doc_line_match:
        doc_line = doc_line_match.group(1)
        compat_match = re.search(r"CompatibleVersion=([^;\s]+)", doc_line)
        if compat_match:
            result["document_compatible_version"] = compat_match.group(1).strip()

    #解析Metadata部分
    metadata_match = re.search(r"<Metadata>[\s\S]*?</Metadata>", text)
    if metadata_match:
        metadata = metadata_match.group(0)
        # 从Metadata XML标签中提取具体信息
        app_match = re.search(r"<Application>([^<]+)</Application>", metadata)
        if app_match:
            result["metadata_application"] = app_match.group(1).strip()
        size_match = re.search(r"<TemplateSize>([^<]+)</TemplateSize>", metadata)
        if size_match:
            result["metadata_template_size"] = size_match.group(1).strip()
        title_match = re.search(r"<Title>([^<]+)</Title>", metadata)
        if title_match:
            result["metadata_title"] = title_match.group(1).strip()

    return result

     3.整合并判断创建版本

def analyze_file(path_str: str) -> dict:
    """分析BTW文件并返回版本信息"""
    file_path = Path(path_str)
    # 基础文件检查
    if not file_path.exists() or not file_path.is_file():
        return {"path": path_str, "error": "文件不存在!"}

    # 读取和解析文件头部
    text = read_head_text(file_path)
    info = parse_btw_header(text)
    
    # 判断创建版本:
    created_version = "未知" 
    if info.get("metadata_application"):
        created_version = info["metadata_application"]
    elif info.get("application_version"):
        parts = [info["application_version"]]
        if info.get("application_edition"):
            parts.append(info["application_edition"])
        if info.get("application_build"):
            parts.append(f"Build {info['application_build']}")
        created_version = " ".join(parts)
    elif info.get("document_compatible_version"):
        created_version = f"Compatible {info['document_compatible_version']}"
    
    # 返回所有解析出的信息和判断出的创建版本
    return {
        "path": str(file_path),
        "created_by_version": created_version, # 最终判断出的创建版本
        "application_version": info.get("application_version"), # Application行中的版本
        "application_build": info.get("application_build"), # Application行中的构建号
        "application_edition": info.get("application_edition"), # Application行中的版本类型
        "document_compatible_version": info.get("document_compatible_version"), # Document行中的兼容版本
        "metadata_application": info.get("metadata_application"), # Metadata中的Application信息
        "metadata_template_size": info.get("metadata_template_size"), # Metadata中的模板尺寸
        "metadata_title": info.get("metadata_title"), # Metadata中的标题
    }

         为方便使用我把之前写的《Python实现调用BarTender SDK对BTW模板进行预览及打印》文章里面的演示程序二次优化集成了本文中的功能,下方为功能演示;有需要的小工具的可在下方免费下载使用。

BTW文件查看助手.gif


微信二维码
验证码:

请关注本站微信公众号,回复“0920”,获取验证码。

在微信里搜索“barcodex_cn”或微信扫描右侧二维码都可以关注本站微信公众号。

文章版权声明:除非注明,否则均为BarcodeX贝恪原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
评论列表 (暂无评论,139人围观)

还没有评论,来说两句吧...

取消
微信二维码
微信二维码
支付宝二维码