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

C# 使用iTextSharp转换HTML为PDF时无法保留表格列宽问题咨询

iTextSharp HTML转PDF表格列宽失效解决方案

问题根因

iTextSharp内置的XMLWorker组件对HTML/CSS的解析规则和浏览器内核不同,默认会根据内容自动分配表格列宽,忽略未符合规范的列宽定义,且现有代码存在页面尺寸设置冲突的问题。

修复步骤

1. 修正HTML表格样式定义

所有表格必须明确指定table-layout: fixed属性,且列宽全部写在内联style中,不要使用原生的width属性,XMLWorker对原生属性的兼容性很差。正确的HTML示例如下:

<table style="table-layout: fixed; width: 100%; border-collapse: collapse;">
  <tr>
    <th style="width: 15%;">合同编号</th>
    <th style="width: 30%;">合同名称</th>
    <th style="width: 25%;">签署方</th>
    <th style="width: 30%;">签署日期</th>
  </tr>
  <!-- 表格其他行内容 -->
</table>
  • 注意:必须保证HTML是严格符合XHTML规范的,所有标签闭合、属性值加引号,否则XMLWorker解析异常会导致排版错乱。

2. 修正C#转换代码的页面尺寸冲突

现有代码中先给Document构造函数传入了自定义尺寸,后续又修改为A4横向,两处定义冲突可能导致排版参数异常,统一改为如下代码:

// 直接在构造时指定A4横向,避免尺寸冲突
Document pdfDoc = new Document(iTextSharp.text.PageSize.A4.Rotate(), 2, 2, 2, 2);
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, stream);
pdfDoc.Open();
// 注意如果sr是StreamReader的话,要确保底层流的Position已经重置为0
XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
pdfDoc.Close();
stream.Position = 0;
return File(stream.ToArray(), "application/pdf", "CONTRACTREGISTER.pdf");

3. 特殊情况处理

如果上述修改后列宽仍然不生效,可以自定义XMLWorker的标签处理器,强制按HTML内联样式设置表格列宽,或者将列宽单位从百分比改为固定px值,XMLWorker对固定像素值的识别优先级更高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 15:18:05