Hello,
I've
attached a working sample of using XMLWorker with RTL Unicode HTML.
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using iTextSharp.tool.xml.css;
using iTextSharp.tool.xml.html;
using iTextSharp.tool.xml.parser;
using iTextSharp.tool.xml.pipeline;
using iTextSharp.tool.xml.pipeline.css;
using iTextSharp.tool.xml.pipeline.end;
using iTextSharp.tool.xml.pipeline.html;
namespace XMLWorkerTests
{
public class UnicodeFontProvider : FontFactoryImp
{
static UnicodeFontProvider()
{
// Ø±ÙØ´ صØÙØ ØªØ¹Ø±ÙÙ ÙÙÙØª
var systemRoot = Environment.GetEnvironmentVariable("SystemRoot");
FontFactory.Register(Path.Combine(systemRoot, "fonts\\tahoma.ttf"));
// ثبت Ø³Ø§ÙØ± ÙÙÙØªâÙØ§ در اÙÙØ¬Ø§
//FontFactory.Register(Path.Combine(Environment.CurrentDirectory, "fonts\\irsans.ttf"));
}
public override Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color, bool cached)
{
if (string.IsNullOrWhiteSpace(fontname))
return new Font(Font.FontFamily.UNDEFINED, size, style, color);
return FontFactory.GetFont(fontname, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, size, style, color);
}
}
/// <summary>
/// تاÙ
ÙÙ ÙÙÙØ¯Ù Ù
Ø³ÙØ± Ø¹ÙØ³âÙØ§Ù Ø°ÙØ± شد٠در ÙØ§ÙÙ Ø§Ú ØªÙ Ø§Ù
اÙ
/// </summary>
public class ImageProvider : AbstractImageProvider
{
public override string GetImageRootPath()
{
var path = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures);
return path + "\\"; // Ù
ÙÙ
است Ù٠اÙÙ Ù
Ø³ÙØ± Ø¨Ù Ø¨Ù Ø§Ø³ÙØ´ ختÙ
Ø´ÙØ¯ تا درست ÙØ§Ø± ÙÙØ¯
}
}
/// <summary>
/// Ù
عاد٠پ٠د٠اÙ٠اÙÙ
اÙâÙØ§Ù Ø§Ú ØªÙ Ø§Ù
ا٠را جÙ
ع Ø¢ÙØ±Ù Ù
ÙâÙÙØ¯
/// </summary>
public class ElementsCollector : IElementHandler
{
private readonly Paragraph _paragraph;
public ElementsCollector()
{
_paragraph = new Paragraph
{
Alignment = Element.ALIGN_LEFT // سبب Ù
ÙâØ´ÙØ¯ تا در ØØ§Ùت راست ب٠ÚÙ¾ از سÙ
ت راست ØµÙØÙ Ø´Ø±ÙØ¹ Ø´ÙØ¯
};
}
/// <summary>
/// اÙÙ Ù¾Ø§Ø±Ø§Ú¯Ø±Ø§Ù ØØ§ÙÙ ÙÙÙ٠اÙÙ
اÙâÙØ§Ù Ù
ت٠است
/// </summary>
public Paragraph Paragraph
{
get { return _paragraph; }
}
/// <summary>
/// بجا٠اÙÙÙÙ Ø®ÙØ¯ ÙØªØ§Ø¨Ø®Ø§Ù٠اصÙÙ ÙØ§Ø± Ø§ÙØ²Ùد٠اÙÙ
اÙâÙØ§ را Ø¨Ù ØµÙØØ§Øª Ø§ÙØ¬Ø§Ù
Ø¯ÙØ¯
/// ÙØµØ¯ دارÙÙ
Ø¢ÙâÙØ§ را ابتدا جÙ
ع Ø¢ÙØ±Ù ÙØ±Ø¯Ù ٠سپس Ø¨Ù ØµÙØ±Øª راست ب٠ÚÙ¾ Ø¨Ù ØµÙØØ§Øª ÙÙØ§Ù٠اضاÙÙ ÙÙÙÙ
/// </summary>
/// <param name="htmlElement"></param>
public void Add(IWritable htmlElement)
{
var writableElement = htmlElement as WritableElement;
if (writableElement == null)
return;
foreach (var element in writableElement.Elements())
{
fixNestedTablesRunDirection(element);
_paragraph.Add(element);
}
}
/// <summary>
/// ÙÙØ§Ø² است سÙÙÙâÙØ§Ù جداÙ٠ت٠در تÙ٠پ٠د٠ا٠ÙÙØ² راست ب٠ÚÙ¾ Ø´ÙÙØ¯
/// </summary>
private void fixNestedTablesRunDirection(IElement element)
{
var table = element as PdfPTable;
if (table == null)
return;
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 item in cell.CompositeElements)
{
fixNestedTablesRunDirection(item);
}
}
}
}
}
public static class XMLWorkerUtils
{
/// <summary>
/// ÙØÙ٠تعرÙÙ ÙÙ ÙØ§Ù٠س٠اس اس خارجÙ
/// </summary>
public static ICssFile GetCssFile(string filePath)
{
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
return XMLWorkerHelper.GetCSS(stream);
}
}
}
class Program
{
/// <summary>
/// XMLWorker RTL sample.
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
using (var pdfDoc = new Document(PageSize.A4))
{
var pdfWriter = PdfWriter.GetInstance(pdfDoc, new FileStream("test.pdf", FileMode.Create));
pdfWriter.RgbTransparencyBlending = true;
pdfDoc.Open();
var html = @"<span style='color:blue; font-family:tahoma;'><b>آزÙ
Ø§ÙØ´</b></span>
ÙØªØ§Ø¨Ø®Ø§ÙÙ <i>iTextSharp</i> <u>Ø¬ÙØª Ø¨Ø±Ø±Ø³Ù ÙØ§Ø±Ø³Ù ÙÙÙØ³Ù</u>
<table style='color:blue; font-family:tahoma;' border='1'><tr><td>eeÙ
تÙ</td></tr></table>
<code>This is a code!</code>
<br/>
<img src='av-13489.jpg' />
";
var cssResolver = new StyleAttrCSSResolver();
// cssResolver.AddCss(XMLWorkerUtils.GetCssFile(@"c:\path\pdf.css"));
cssResolver.AddCss(@"code
{
padding: 2px 4px;
color: #d14;
white-space: nowrap;
background-color: #f7f7f9;
border: 1px solid #e1e1e8;
}",
"utf-8", true);
// ÙØ§Ø± جÙ
ع Ø¢ÙØ±Ù اÙÙ
اÙâÙØ§Ù ترجÙ
٠شد٠ب٠اÙÙ
اÙâÙØ§Ù پ٠د٠ا٠را Ø§ÙØ¬Ø§Ù
Ù
ÙâØ¯ÙØ¯
var elementsHandler = new ElementsCollector();
var htmlContext = new HtmlPipelineContext(new CssAppliersImpl(new UnicodeFontProvider()));
htmlContext.SetImageProvider(new ImageProvider());
htmlContext.CharSet(Encoding.UTF8);
htmlContext.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(Tags.GetHtmlTagProcessorFactory());
var pipeline = new CssResolverPipeline(cssResolver,
new HtmlPipeline(htmlContext, new ElementHandlerPipeline(elementsHandler, null)));
var worker = new XMLWorker(pipeline, parseHtml: true);
var parser = new XMLParser();
parser.AddListener(worker);
parser.Parse(new StringReader(html));
// با ÙÙØ¯Ùر Ø³ÙØ§Ø±Ø´Ù Ù٠تÙÙÙ ÙØ±Ø¯ÙÙ
تÙ
اÙ
اÙÙ
اÙâÙØ§Ù Ø§Ú ØªÙ Ø§Ù
ا٠ب٠اÙÙ
اÙâÙØ§Ù پ٠د٠ا٠تبدÙÙ Ø´Ø¯ÙØ¯
// Ø§ÙØ§Ù تÙÙØ§ ÙØ§ÙÙ ÙØ§Ù٠است تا اÙÙâÙØ§ را در Ù٠جدÙ٠راست ب٠ÚÙ¾ Ù
ØØµÙر ÙÙÙÙ
تا درست ÙÙ
Ø§ÙØ´ داد٠شÙÙØ¯
var mainTable = new PdfPTable(1) { WidthPercentage = 100, RunDirection = PdfWriter.RUN_DIRECTION_RTL };
var cell = new PdfPCell
{
Border = 0,
RunDirection = PdfWriter.RUN_DIRECTION_RTL,
HorizontalAlignment = Element.ALIGN_LEFT
};
cell.AddElement(elementsHandler.Paragraph);
mainTable.AddCell(cell);
pdfDoc.Add(mainTable);
}
Process.Start("test.pdf");
}
}
}
------------------------------------------------------------------------------
Get 100% visibility into Java/.NET code with AppDynamics Lite!
It's a free troubleshooting tool designed for production.
Get down to code-level detail for bottlenecks, with <2% overhead.
Download for free and get started troubleshooting in minutes.
http://pubads.g.doubleclick.net/gampad/clk?id=48897031&iu=/4140/ostg.clktrk
_______________________________________________
iText-questions mailing list
iText-questions@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/itext-questions
iText(R) is a registered trademark of 1T3XT BVBA.
Many questions posted to this list can (and will) be answered with a reference
to the iText book: http://www.itextpdf.com/book/
Please check the keywords list before you ask for examples:
http://itextpdf.com/themes/keywords.php