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
相关产品推荐
相关产品推荐

