You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正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):匹配三个废弃属性中的任意一个
  • ="[^"]+":匹配属性值部分(双引号包裹的任意内容,除了双引号本身)

注意事项

  1. 替换前务必备份所有JXML文件,避免意外损坏
  2. 用-Filter "*.jxml"可以只处理目标文件,提高效率
  3. -Raw参数会一次性读取整个文件内容,避免逐行处理时的换行问题
  4. 指定-Encoding UTF8确保文件编码一致,防止乱码

内容的提问来源于stack exchange,提问作者ChandlerBing

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:02:20