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

PowerShell转代码文件为PDF时格式丢失的解决求助

解决代码文件转PDF时缩进格式丢失的问题

你的脚本已实现核心功能,但iTextSharp的Paragraph组件默认不会正确解析制表符(\t),导致代码缩进丢失。以下是修复方案:

关键修复点

  • 为Paragraph设置制表位,让制表符对应固定宽度的缩进
  • 保持使用等宽字体(你已选用Courier,这是正确的,等宽字体是保证代码对齐的基础)

修改后的完整脚本

Add-Type -Path "C:\Program Files\WindowsPowerShell\Modules\itextsharp\5.5.13.3\lib\itextsharp.dll"

function Merge-FilesToPdf {
    param(
        [Parameter(Mandatory = $true)]
        [string]$SourcePath,
        
        [Parameter(Mandatory = $true)]
        [string]$DestinationFile
    )
    
    # 创建PDF文档实例
    $document = New-Object iTextSharp.text.Document
    
    # 初始化PDF写入器
    $writer = [iTextSharp.text.pdf.PdfWriter]::GetInstance($document, [System.IO.File]::Create($DestinationFile))
    
    # 打开PDF文档
    $document.Open()
    
    try {
        # 定义等宽字体(Courier),嵌入字体避免缺失
        $baseFont = [iTextSharp.text.pdf.BaseFont]::CreateFont([iTextSharp.text.pdf.BaseFont]::COURIER, [iTextSharp.text.pdf.BaseFont]::CP1252, [iTextSharp.text.pdf.BaseFont]::EMBEDDED)
        $font = New-Object iTextSharp.text.Font($baseFont, 10) # 设置字体大小
        
        # 计算制表位宽度:对应4个空格的宽度(等宽字体下空格宽度固定)
        $spaceWidth = $baseFont.GetWidthPoint(" ", 10)
        $tabWidth = $spaceWidth * 4
        
        # 筛选目标格式文件
        $targetExtensions = @(".c", ".cpp", ".java", ".xml", ".txt", ".log", ".ps1")
        $files = Get-ChildItem -Path $SourcePath -File | Where-Object { $targetExtensions -contains $_.Extension }
        
        foreach ($file in $files) {
            # 每个文件新建一页
            $document.NewPage()
            
            # 添加文件名标题
            $header = New-Object iTextSharp.text.Paragraph($file.Name, $font)
            $header.SpacingAfter = 10 # 标题与内容间增加间距
            $document.Add($header)
            
            # 逐行读取文件内容,保留原行结构
            $contentLines = Get-Content -Path $file.FullName
            
            # 创建带制表位配置的段落
            $contentPara = New-Object iTextSharp.text.Paragraph
            $contentPara.Font = $font
            # 添加多级制表位,适配不同层级的缩进
            $contentPara.AddTabStop($tabWidth)
            $contentPara.AddTabStop($tabWidth * 2)
            $contentPara.AddTabStop($tabWidth * 3)
            
            # 将每行内容添加到段落
            foreach ($line in $contentLines) {
                $contentPara.Add($line + [Environment]::NewLine)
            }
            
            $document.Add($contentPara)
        }
    }
    finally {
        # 释放资源
        $document.Close()
        $writer.Close()
        $document.Dispose()
        $writer.Dispose()
    }
}

# 调用示例
Merge-FilesToPdf -SourcePath "C:\Projekt\test\kl01\erg001" -DestinationFile "C:\Output.pdf"

额外优化说明

  1. 精准筛选文件:用数组直接匹配目标扩展名,比正则表达式更直观且不易出错
  2. 逐行读取内容:避免-Raw参数可能带来的换行符解析问题,更好保留原文件的行结构
  3. 多级制表位配置:适配代码的多层嵌套缩进,确保每级缩进都能正确对齐
  4. 调整排版细节:设置标题与内容的间距、字体大小,提升PDF的可读性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:05:15