82 lines
5.1 KiB
PowerShell
82 lines
5.1 KiB
PowerShell
param([Parameter(Mandatory=$true)][string]$Directory)
|
|
$ErrorActionPreference='Stop'
|
|
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
|
$ns='http://schemas.openxmlformats.org/wordprocessingml/2006/main'
|
|
|
|
function Set-Attr($node,$name,$value,$xml){
|
|
$attr=$xml.CreateAttribute('w',$name,$ns); $attr.Value=[string]$value
|
|
[void]$node.Attributes.SetNamedItem($attr)
|
|
}
|
|
function Ensure-Child($parent,$local,$xml){
|
|
$child=$parent.SelectSingleNode("w:$local",$script:nsmgr)
|
|
if(-not $child){$child=$xml.CreateElement('w',$local,$ns); [void]$parent.AppendChild($child)}
|
|
return $child
|
|
}
|
|
function Set-Style($xml,$styleId,$font,$eastAsia,$sizeHalf,$color,$bold,$before,$after,$line){
|
|
$s=$xml.SelectSingleNode("//w:style[@w:styleId='$styleId']",$script:nsmgr); if(-not $s){return}
|
|
$rPr=Ensure-Child $s 'rPr' $xml
|
|
$fonts=Ensure-Child $rPr 'rFonts' $xml; Set-Attr $fonts 'ascii' $font $xml; Set-Attr $fonts 'hAnsi' $font $xml; Set-Attr $fonts 'eastAsia' $eastAsia $xml
|
|
$sz=Ensure-Child $rPr 'sz' $xml; Set-Attr $sz 'val' $sizeHalf $xml
|
|
$szCs=Ensure-Child $rPr 'szCs' $xml; Set-Attr $szCs 'val' $sizeHalf $xml
|
|
$c=Ensure-Child $rPr 'color' $xml; Set-Attr $c 'val' $color $xml
|
|
$b=$rPr.SelectSingleNode('w:b',$script:nsmgr)
|
|
if($bold -and -not $b){$b=$xml.CreateElement('w','b',$ns); [void]$rPr.AppendChild($b)} elseif(-not $bold -and $b){[void]$rPr.RemoveChild($b)}
|
|
$pPr=Ensure-Child $s 'pPr' $xml
|
|
$spacing=Ensure-Child $pPr 'spacing' $xml; Set-Attr $spacing 'before' $before $xml; Set-Attr $spacing 'after' $after $xml; Set-Attr $spacing 'line' $line $xml; Set-Attr $spacing 'lineRule' 'auto' $xml
|
|
}
|
|
|
|
foreach($file in Get-ChildItem -LiteralPath $Directory -Filter '*.docx'){
|
|
$tmp=Join-Path $Directory ('.tmp_'+[guid]::NewGuid().ToString('N'))
|
|
[IO.Compression.ZipFile]::ExtractToDirectory($file.FullName,$tmp)
|
|
try{
|
|
[xml]$styles=Get-Content -Raw -Encoding UTF8 (Join-Path $tmp 'word\styles.xml')
|
|
$script:nsmgr=New-Object Xml.XmlNamespaceManager($styles.NameTable); $nsmgr.AddNamespace('w',$ns)
|
|
Set-Style $styles 'Normal' 'Calibri' 'Microsoft YaHei' 21 '000000' $false 0 120 300
|
|
Set-Style $styles 'Title' 'Calibri' 'Microsoft YaHei' 50 '17365D' $true 1200 240 240
|
|
Set-Style $styles 'Subtitle' 'Calibri' 'Microsoft YaHei' 28 '666666' $false 0 360 280
|
|
Set-Style $styles 'Heading1' 'Calibri' 'Microsoft YaHei' 32 '2E74B5' $true 320 160 280
|
|
Set-Style $styles 'Heading2' 'Calibri' 'Microsoft YaHei' 26 '2E74B5' $true 240 120 280
|
|
Set-Style $styles 'Heading3' 'Calibri' 'Microsoft YaHei' 23 '1F4D78' $true 180 80 280
|
|
$styles.Save((Join-Path $tmp 'word\styles.xml'))
|
|
|
|
[xml]$doc=Get-Content -Raw -Encoding UTF8 (Join-Path $tmp 'word\document.xml')
|
|
$script:nsmgr=New-Object Xml.XmlNamespaceManager($doc.NameTable); $nsmgr.AddNamespace('w',$ns)
|
|
foreach($sect in $doc.SelectNodes('//w:sectPr',$nsmgr)){
|
|
$pgSz=Ensure-Child $sect 'pgSz' $doc; Set-Attr $pgSz 'w' 12240 $doc; Set-Attr $pgSz 'h' 15840 $doc
|
|
$pgMar=Ensure-Child $sect 'pgMar' $doc; Set-Attr $pgMar 'top' 1224 $doc; Set-Attr $pgMar 'right' 1296 $doc; Set-Attr $pgMar 'bottom' 1152 $doc; Set-Attr $pgMar 'left' 1296 $doc; Set-Attr $pgMar 'header' 504 $doc; Set-Attr $pgMar 'footer' 504 $doc; Set-Attr $pgMar 'gutter' 0 $doc
|
|
}
|
|
foreach($tbl in $doc.SelectNodes('//w:tbl',$nsmgr)){
|
|
$tblPr=Ensure-Child $tbl 'tblPr' $doc
|
|
$style=Ensure-Child $tblPr 'tblStyle' $doc; Set-Attr $style 'val' 'TableGrid' $doc
|
|
$layout=Ensure-Child $tblPr 'tblLayout' $doc; Set-Attr $layout 'type' 'autofit' $doc
|
|
$first=$tbl.SelectSingleNode('w:tr[1]',$nsmgr)
|
|
if($first){
|
|
$trPr=Ensure-Child $first 'trPr' $doc; $hdr=Ensure-Child $trPr 'tblHeader' $doc; Set-Attr $hdr 'val' 1 $doc
|
|
foreach($cell in $first.SelectNodes('w:tc',$nsmgr)){
|
|
$tcPr=Ensure-Child $cell 'tcPr' $doc; $shd=Ensure-Child $tcPr 'shd' $doc; Set-Attr $shd 'fill' '17365D' $doc
|
|
foreach($rPr in $cell.SelectNodes('.//w:rPr',$nsmgr)){ $c=Ensure-Child $rPr 'color' $doc; Set-Attr $c 'val' 'FFFFFF' $doc; if(-not $rPr.SelectSingleNode('w:b',$nsmgr)){[void]$rPr.AppendChild($doc.CreateElement('w','b',$ns))} }
|
|
}
|
|
}
|
|
}
|
|
$doc.Save((Join-Path $tmp 'word\document.xml'))
|
|
|
|
foreach($hf in Get-ChildItem -LiteralPath (Join-Path $tmp 'word') -Filter 'header*.xml' -ErrorAction SilentlyContinue){
|
|
[xml]$hx=Get-Content -Raw -Encoding UTF8 $hf.FullName
|
|
$script:nsmgr=New-Object Xml.XmlNamespaceManager($hx.NameTable); $nsmgr.AddNamespace('w',$ns)
|
|
foreach($t in $hx.SelectNodes('//w:t',$nsmgr)){$t.InnerText='大规模多智能体网络流量建模与预测'}
|
|
foreach($rPr in $hx.SelectNodes('//w:rPr',$nsmgr)){
|
|
$fonts=Ensure-Child $rPr 'rFonts' $hx; Set-Attr $fonts 'eastAsia' 'Microsoft YaHei' $hx
|
|
$sz=Ensure-Child $rPr 'sz' $hx; Set-Attr $sz 'val' 17 $hx
|
|
$c=Ensure-Child $rPr 'color' $hx; Set-Attr $c 'val' '777777' $hx
|
|
}
|
|
$hx.Save($hf.FullName)
|
|
}
|
|
|
|
$new=$file.FullName+'.new'
|
|
if(Test-Path $new){Remove-Item -LiteralPath $new}
|
|
[IO.Compression.ZipFile]::CreateFromDirectory($tmp,$new)
|
|
Copy-Item -Force -LiteralPath $new -Destination $file.FullName
|
|
Remove-Item -LiteralPath $new
|
|
} finally { Remove-Item -Recurse -Force -LiteralPath $tmp }
|
|
}
|