The story about English, Arabic and a dotted separator

vadamovsky <[email protected]>
Newsgroups gmane.comp.java.lib.itext.general
Message-ID <[email protected]>
I'm trying to create a content page with lines like:

Chapter one...................101
Chapter two...................102
etc.

Some chapters are in English some are in Arabic. But the page numbers should
always be on one side (left or right).

I have this code:

           
/FontFactory.RegisterDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Fonts));
            iTextSharp.text.Font font = FontFactory.GetFont("Tahoma",
BaseFont.IDENTITY_H, 15f, iTextSharp.text.Font.NORMAL, new BaseColor(0, 0,
0));
            using (Document doc = new Document(PageSize.A4))
            {
                PdfWriter writer = PdfWriter.GetInstance(doc, new
FileStream("C:\\sample.pdf", FileMode.Create));
                doc.Open();
                doc.SetMargins(52f, 52f, 52f, 52f);
                PdfContentByte content = writer.DirectContent;
                content.SaveState();
                content.Rectangle(doc.Left, 0, doc.Right - doc.Left,
doc.Top);
                content.SetColorFill(new BaseColor(240, 240, 240));
                content.Fill();
                content.RestoreState();
                ColumnText colt = new ColumnText(content);
                colt.SetSimpleColumn(doc.Left, doc.Bottom, doc.Right,
doc.Top);
                ColumnText coltrtl = new ColumnText(content);
                coltrtl.SetSimpleColumn(doc.Left, doc.Bottom, doc.Right,
doc.Top);
                coltrtl.RunDirection = *PdfWriter.RUN_DIRECTION_RTL*;

                Paragraph par = new Paragraph("مكتبة مؤلفة من 15 دورة
تفاعلية", font);
                par.Alignment = *Element.ALIGN_LEFT*;
                coltrtl.AddElement(par);
                coltrtl.Go();

                doc.Close();
            }/

As you can see, the /Element.ALIGN_LEFT/ for RTL ColumnText means aligning
to the right:
<http://itext-general.2136553.n4.nabble.com/file/n4660411/02.png> 

Now let's add a separator:

                /Paragraph par = new Paragraph("مكتبة مؤلفة من 15 دورة
تفاعلية", font);
                par.Alignment = Element.ALIGN_LEFT;
                *iTextSharp.text.pdf.draw.DottedLineSeparator separator =
new iTextSharp.text.pdf.draw.DottedLineSeparator();
                par.Add(new Chunk(separator));
                par.Add(new Chunk("123", font));
*                coltrtl.AddElement(par);
                coltrtl.Go();/

We get:
<http://itext-general.2136553.n4.nabble.com/file/n4660411/03.png> 

When the separator is added we have to align the paragraph to the right:

                /Paragraph par = new Paragraph("مكتبة مؤلفة من 15 دورة
تفاعلية", font);
                par.Alignment = *Element.ALIGN_RIGHT*;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                par.Add(new Chunk(separator));
                par.Add(new Chunk("123", font));
                coltrtl.AddElement(par);
                coltrtl.Go();/

<http://itext-general.2136553.n4.nabble.com/file/n4660411/04.png> 

This looks good. But some Arabic text may contain English words:

                /Paragraph par = new Paragraph("*MS Office 2013 - الترقية من
MS Office 2010*", font);
                par.Alignment = Element.ALIGN_RIGHT;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                par.Add(new Chunk(separator));
                par.Add(new Chunk("123", font));
                coltrtl.AddElement(par);
                coltrtl.Go();/

<http://itext-general.2136553.n4.nabble.com/file/n4660411/05.png> 

To fix this we have to add the RightToLeft mark at the end of the string:

                /Paragraph par = new Paragraph("MS Office 2013 - الترقية من
MS Office 2010" *+ ((char)0x200F)*, font);
                par.Alignment = Element.ALIGN_RIGHT;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                par.Add(new Chunk(separator));
                par.Add(new Chunk("123", font));
                coltrtl.AddElement(par);
                coltrtl.Go();/

<http://itext-general.2136553.n4.nabble.com/file/n4660411/06.png> 

This looks good. Now we have to solve a situation for multi-line chapter
names:

                Paragraph par = new Paragraph("*تفاعليةتفاعليةتفاعلية
تفاعليةتفاعليةتفاعلية تفاعليةتفاعليةتفاعلية تفاعليةتفاعليةتفاعلية*" +
((char)0x200F), font);
                par.Alignment = Element.ALIGN_RIGHT;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                par.Add(new Chunk(separator));
                par.Add(new Chunk("123", font));
                coltrtl.AddElement(par);
                coltrtl.Go();

<http://itext-general.2136553.n4.nabble.com/file/n4660411/07.png> 

And we have a problem. The first line should be aligned to the right. But as
we know, we cannot use Element.ALIGN_LEFT:

                Paragraph par = new Paragraph("تفاعليةتفاعليةتفاعلية
تفاعليةتفاعليةتفاعلية تفاعليةتفاعليةتفاعلية تفاعليةتفاعليةتفاعلية" +
((char)0x200F), font);
                par.Alignment = *Element.ALIGN_LEFT*;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                par.Add(new Chunk(separator));
                par.Add(new Chunk("123", font));
                coltrtl.AddElement(par);
                coltrtl.Go();

<http://itext-general.2136553.n4.nabble.com/file/n4660411/08.png> 

Can this be solved?

Sometimes, we need to keep the page numbers on the right side even for
Arabic texts. I see only one solution: Add the page number first then the
chapter title:

                /Paragraph par = *new Paragraph("123", font);*
                par.Alignment = Element.ALIGN_RIGHT;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                par.Add(new Chunk(separator));
                *par.Add(new Chunk("مكتبة مؤلفة من 15 دورة تفاعلية" +
((char)0x200F), font));
*                coltrtl.AddElement(par);
                coltrtl.Go();/

<http://itext-general.2136553.n4.nabble.com/file/n4660411/09.png> 

This works but only for single-line chapters:

                /Paragraph par = new Paragraph("123", font);
                par.Alignment = Element.ALIGN_RIGHT;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                par.Add(new Chunk(separator));
                par.Add(new Chunk(*"تفاعليةتفاعليةتفاعلية
تفاعليةتفاعليةتفاعلية تفاعليةتفاعليةتفاعلية تفاعليةتفاعليةتفاعلية"* +
((char)0x200F), font));
                coltrtl.AddElement(par);
                coltrtl.Go();/

<http://itext-general.2136553.n4.nabble.com/file/n4660411/10.png> 

Can this be solved?

Similar problem is with English text. I'm unable to draw a multi-line
chapter name and a page number on the left side:

                /Paragraph par = new Paragraph(*"This is a chapter with a
really really really really really really really long name"*, font);
                par.Alignment = Element.ALIGN_RIGHT;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                *separator.Alignment = Element.ALIGN_RIGHT;
*                par.Add(new Chunk(separator));
                par.Add(new Chunk("123", font));
                coltrtl.AddElement(par);
                coltrtl.Go();/

<http://itext-general.2136553.n4.nabble.com/file/n4660411/11.png> 

The /separator.Alignment /has no effect. We can use the same trick with the
RightToLeft mark:

                /Paragraph par = new Paragraph("This is a chapter with a
really really really really really really really long name" +
*((char)0x200F*), font);
                par.Alignment = Element.ALIGN_RIGHT;
                iTextSharp.text.pdf.draw.DottedLineSeparator separator = new
iTextSharp.text.pdf.draw.DottedLineSeparator();
                separator.Alignment = Element.ALIGN_RIGHT;
                par.Add(new Chunk(separator));
                par.Add(new Chunk("123", font));
                coltrtl.AddElement(par);
                coltrtl.Go();/

<http://itext-general.2136553.n4.nabble.com/file/n4660411/12.png> 

But we have the same problem - the first line should be aligned to the
right.




--
View this message in context: http://itext-general.2136553.n4.nabble.com/The-story-about-English-Arabic-and-a-dotted-separator-tp4660411.html
Sent from the iText - General mailing list archive at Nabble.com.

------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
_______________________________________________
iText-questions mailing list
[email protected]
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.