Azure Pipeline中使用lowriter转docx为pdf提示源文件无法加载怎么办
故障现象
在Azure Pipeline任务中调用lowriter将生成的docx格式报告转换为PDF时,触发报错:
Error: source file could not be loaded
已确认执行时处于正确工作目录,目标文件存在于目录内,且lowriter命令在本地环境运行正常。使用通配符批量转换目录内docx文件时,仅目标报告文件无法被转换,其余docx文件转换流程正常。
关联流水线配置
- task: Bash@3 inputs: targetType: 'inline' workingDirectory: '$(build.artifactstagingdirectory)' script: | sudo apt install libreoffice-writer wget https://github.com/cnescatlab/sonar-cnes-report/releases/download/4.1.1/sonar-cnes-report-4.1.1.jar java -jar sonar-cnes-report-4.1.1.jar -t mytoken -s mysqserver -p myproject --disable-spreadsheet --disable-markdown --disable-csv -r ./code-analysis-template.docx chmod 777 myfile.docx lowriter --headless --convert-to pdf myfile.docx
已尝试的批量转换命令:
lowriter --headless --convert-to pdf *.docx --outdir mydirectory
排查修复方案
按优先级依次排查以下问题:
- 文件写入时序问题:sonar-cnes-report的java进程退出不代表报告文件已经完全写入磁盘,IO延迟会导致
lowriter读取时文件处于占用/未写完状态,触发加载失败。在报告生成命令后增加等待和文件校验步骤即可:java -jar sonar-cnes-report-4.1.1.jar [原有运行参数] # 等待磁盘写入完成 sleep 3 # 校验文件真实存在、大小正常 ls -lh *.docx - 权限与属主问题:Azure Pipeline构建任务默认以
vsts用户运行,命令前加sudo会导致生成的文件属主变为root,低版本LibreOffice在headless模式下读取其他用户属主的文件时,会无提示抛出加载错误。修复方式:- 去掉
apt命令前的sudo,构建代理默认拥有apt执行权限,安装时加-y参数跳过交互确认:apt update && apt install -y libreoffice-writer - 报告生成后统一修正目录权限,避免属主异常:
chown -R vsts:vsts $(build.artifactstagingdirectory) chmod 644 myfile.docx
- 去掉
- 文件完整性问题:docx本质是zip格式压缩包,如果自定义模板
code-analysis-template.docx本身格式不合法(比如把doc后缀文件强行改名为docx、模板文件损坏),会导致生成的报告文件损坏,lowriter无法加载。转换前先校验文件合法性:
如果校验失败,优先替换为标准格式的docx模板重新生成报告。# 校验docx压缩包完整性,合法时会输出OK提示 unzip -t myfile.docx - LibreOffice配置目录权限问题:headless模式首次启动会在当前用户家目录生成配置文件,如果执行用户的家目录权限异常,会导致启动失败。转换时指定临时配置目录绕开权限问题:
lowriter --headless -env:UserInstallation=file:///tmp/libreoffice_tmp --convert-to pdf myfile.docx - 文件名匹配问题:sonar-cnes-report 4.1.1版本默认生成的报告文件名格式为
${项目名}-analysis-report.docx,如果硬编码写死myfile.docx,可能匹配到历史残留的损坏文件,执行ls *.docx确认实际生成的报告文件名后再传入转换命令即可。
内容的提问来源于stack exchange,提问作者P.T
相关产品推荐
相关产品推荐

