如何转换LibreOffice API返回的含中间相对路径的URI?
解决LibreOffice API返回URI中相对路径的转换问题
要将包含../这类相对路径的LibreOffice API返回URI转换为标准绝对路径,有两种可靠的实现方式:
方式一:利用LibreOffice UNO原生API
LibreOffice自带的com.sun.star.io.FileAccess服务可直接处理路径解析与转换,无需依赖外部工具:
- 创建
FileAccess服务实例; - 调用
parseUri()将原始URI转换为系统本地路径; - 调用
getAbsolutePath()自动解析本地路径中的相对部分(如../); - 调用
getFileURLFromSystemPath()将处理后的本地路径转回标准URI格式。
示例LibreOffice Basic宏代码:
Sub ResolveRelativeURI Dim oFileAccess As Object Dim originalURI As String Dim absoluteURI As String originalURI = "file:///C:/Program%20Files/LibreOffice/program/../share/gallery/sounds/apert2.wav" oFileAccess = CreateUnoService("com.sun.star.io.FileAccess") Dim localPath As String localPath = oFileAccess.parseUri(originalURI) Dim absLocalPath As String absLocalPath = oFileAccess.getAbsolutePath(localPath) absoluteURI = oFileAccess.getFileURLFromSystemPath(absLocalPath) Print absoluteURI End Sub
方式二:用编程语言标准库处理
如果在外部程序(如Python)中调用LibreOffice API,可结合语言自带的URI解析和路径标准化工具:
- 解析原始URI,分离出路径部分;
- 解码路径中的URL编码字符(如
%20),得到系统本地路径; - 用路径标准化函数(如Python的
os.path.normpath)去除相对路径部分; - 重新编码路径中的特殊字符,再拼接成标准URI。
示例Python代码:
import os from urllib.parse import urlparse, urlunparse, unquote, quote original_uri = "file:///C:/Program%20Files/LibreOffice/program/../share/gallery/sounds/apert2.wav" # 解析URI结构 parsed_uri = urlparse(original_uri) # 解码路径为本地格式 decoded_path = unquote(parsed_uri.path) # 标准化路径,自动处理../ normalized_path = os.path.normpath(decoded_path) # 重新编码路径为URL格式 encoded_path = quote(normalized_path) # 重构绝对URI absolute_uri = urlunparse(parsed_uri._replace(path=encoded_path)) print(absolute_uri)
两种方法都能将示例URI转换为目标格式:file:///C:/Program%20Files/LibreOffice/share/gallery/sounds/apert2.wav
内容的提问来源于stack exchange,提问作者Amour Spirit
相关产品推荐
相关产品推荐

