我使用ITextSharp库将html转换为pdf。 我的用户在她/他的html文件中使用波斯语句,所以这个库不能转换波斯语。
为了解决这个问题以及从右到左的问题,请使用以下代码:
Document document = new Document(PageSize.A4, 80, 50, 30, 65);
PdfWriter.GetInstance(document, new FileStream(strPDFpath, FileMode.Create));
document.Open();
ArrayList objects;
document.NewPage();
var stream = new StreamReader(strHTMLpath, Encoding.Default).ReadToEnd();
objects = iTextSharp.text.html.simpleparser.
HTMLWorker.ParseToList(new StreamReader(strHTMLpath, Encoding.UTF8), styles);
BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\Tahoma.ttf",
BaseFont.IDENTITY_H, true);
for (int k = 0; k < objects.Count; k++)
{
PdfPTable table = new PdfPTable(1);
table.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
var els = (IElement)objects[k];
foreach (Chunk el in els.Chunks)
{
#region set persian font
iTextSharp.text.Font f2 = new iTextSharp.text.Font(bf, el.Font.Size,
el.Font.Style, el.Font.Color);
el.Font = f2;
#endregion set persian font
#region Set right to left for persian words
PdfPCell cell = new PdfPCell(new Phrase(10, el.Content, el.Font));
cell.BorderWidth = 0;
table.AddCell(cell);
#endregion Set right to left for persian words
}
//document.Add((IElement)objects[k]);
document.Add(table);
}
document.Close();
Response.Write(strPDFpath);
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment; filename=" + strPDFpath);
Response.ContentType = "application/octet-stream";
Response.WriteFile(strPDFpath);
Response.Flush();
Response.Close();
if (File.Exists(strPDFpath))
{
File.Delete(strPDFpath);
}
我的左派和转换波斯语的权利得到了解决,但还有另一个问题。
我的算法无法解析和转换在html文件中使用的表格标签的内容。
现在的问题是:如何使用波斯语句子解析具有表格标记,div和段落标记的html文件,并将其转换为pdf?
答案 0 :(得分:3)
iTextSharp也可以解析表格标签。但它没有设置其RTL属性,您需要自己修复它:
foreach (var htmlElement in parsedHtmlElements)
{
fixRunDirection(htmlElement);
pdfCell.AddElement(htmlElement);
}
...
private static void fixRunDirection(IElement htmlElement)
{
if (!(htmlElement is PdfPTable)) return;
var table = (PdfPTable)htmlElement;
table.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
foreach (var row in table.Rows)
{
foreach (var cell in row.GetCells())
{
cell.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
foreach (var element in cell.CompositeElements)
{
fixRunDirection(element);
}
}
}
}
更多信息:(^)
答案 1 :(得分:1)
尝试使用此功能 http://code.google.com/p/wkhtmltopdf/
该应用程序读取html页面并将其另存为pdf。只需使用shell脚本在C#中运行该东西。