如何修正PowerShell脚本以移除JXML文件中废弃PDF属性
批量移除Jasper报表JXML中的废弃PDF字体属性
我有上千个Jasper报表的JXML文件,其中包含废弃的pdfFontName、pdfEncoding和isPdfEmbedded属性,运行时会触发警告:PDF Font is deprecated and replaced by the Font Extension。需要批量移除这些属性及其对应的值,但之前写的PowerShell正则替换脚本没生效,只有替换具体属性值时能正常工作。
示例
原代码行:
<font fontName="Courier New" size="10" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" pdfFontName="cour.ttf"/>
修正后:
<font fontName="Courier New" size="10" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" />
问题原因
你之前用的String.Replace()方法是字面字符串匹配,不支持正则表达式语法,所以写的'pdfFontName="\w+"'会被当作普通文本查找,自然找不到匹配项;而替换具体值(比如'pdfFontName="Helvetica"')是字面匹配,所以能生效。
修正后的PowerShell脚本
使用PowerShell的-replace运算符(支持正则表达式)来批量处理三个废弃属性:
# 替换前建议先备份文件! Get-ChildItem "pathToFile" -Recurse -Filter "*.jxml" | ForEach-Object { # 读取文件内容,移除三个废弃属性(包含前后空格) $content = Get-Content $_.FullName -Raw -Encoding UTF8 $newContent = $content -replace '\s*(pdfFontName|pdfEncoding|isPdfEmbedded)="[^"]+"', '' # 写入修改后的内容,保持UTF8编码 $newContent | Set-Content $_.FullName -Encoding UTF8 }
正则说明
\s*:匹配属性前可能存在的0个或多个空格(pdfFontName|pdfEncoding|isPdfEmbedded):匹配三个废弃属性中的任意一个="[^"]+":匹配属性值部分(双引号包裹的任意内容,除了双引号本身)
注意事项
- 替换前务必备份所有JXML文件,避免意外损坏
- 用
-Filter "*.jxml"可以只处理目标文件,提高效率 -Raw参数会一次性读取整个文件内容,避免逐行处理时的换行问题- 指定
-Encoding UTF8确保文件编码一致,防止乱码
内容的提问来源于stack exchange,提问作者ChandlerBing
相关产品推荐
相关产品推荐

