通过ITextSharp从persian html文件创建pdf

时间:2011-02-08 08:03:55

标签: c# asp.net html localization

我使用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?

2 个答案:

答案 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#中运行该东西。