Reversing Strings in Right To Left (BiDirectional)

2020-04-07 07:57发布

I'm using iTextSharp( C# iText port) to create pdfs from text/html. Most of my text is in Hebrew, a Right-To-Left language.

My problem is that PDFs show RTL langauge in reverse, so I need to reverse my strings in a way that would only reverse the RTL text without reversing any numbers or text in English. It is my understanding that fribidi allows doing that on linux, but I couldn't find any solutions for this problem for Windows.

I would welcome any suggestions, including an alternative to iTextSharp that would do this automatically (if one exists).

4条回答
趁早两清
2楼-- · 2020-04-07 08:22

HTML displays Hebrew/Arabic in Logical mode, and in PDF you need to store it Visual mode. What you need to do is convert from Logical to Visual mode. There are some libraries which do this (google for minibidi which is BSD licensed IMHO, or fribidi which is GPL or LGPL).

My real suggestion would be to change direction. Write a very small application in Qt4 which takes as first argument the URL, and the second the PDF to write. Since Qt4 has HTML support (via QtWebKit) has has the option to print to PDF (post script and SVG as well) this should be simpler then writing your own HTML->PDF solution.

查看更多
够拽才男人
3楼-- · 2020-04-07 08:24

Just put the string in table cell:

PdfPCell cell1 = new PdfPCell(new Phrase("מספר",font));
cell1.HorizontalAlignment = 2; //0=Left, 1=Centre, 2=Right
查看更多
够拽才男人
4楼-- · 2020-04-07 08:25

To show RTL texts by using iTextSharp correctly:

  • You need to set the font's encoding to BaseFont.IDENTITY_H
  • Then you have to use container elements which support RunDirection, such as PdfPCell, ColumnText, etc. and now you can set their element.RunDirection = PdfWriter.RUN_DIRECTION_RTL;
查看更多
虎瘦雄心在
5楼-- · 2020-04-07 08:26

PDFCreator is a free tool to create PDF files from nearly any Windows application. It installs as a Windows printer driver, such that it can be used by any Windows program that has a print functionality.

You can treat your input as simple text strings to be printed, and maybe using the print menu option of Notepad will create the correct PDF.

If you want to dive a little deeper into right to left C# printing, use StringFormatFlags.DirectionRightToLeft string format with Graphics.DrawString() calls.

A snippet from a PrintPage Event Handler:

lineFmt = new StringFormat(StringFormatFlags.DirectionRightToLeft);
e.Graphics.DrawString(textToPrint, font, Brushes.Black, startX, ypos, lineFmt);
查看更多
登录 后发表回答