Нужно написать арабский текст внутри ячейки таблицы в заголовке PDF, используя реализацию iText в Lowagie - PullRequest
0 голосов
/ 25 апреля 2019

Клиент попросил нас создать таблицу с некоторыми полями и значением в сгенерированном заголовке PDF.Этот заголовок необходимо повторить.

В более ранней реализации данные в PDFPTable и PDFPCell содержались в основном тексте, и их не удавалось повторить даже после множества попыток.Мы перешли от PDFPTable -> Table и PDFPCell -> Cell, и это сработало в шапке.Теперь один из столбцов таблицы содержит арабский текст, и нет опции RUNDIRECTION, устанавливающей RTL в простых таблицах и ячейках.Текст, написанный на Unicode, напечатан неправильно.Любая помощь приветствуется.Исходный код, указанный для справки, является ОБРАЗЕЦОМ и не содержит полной обработки.

public class DataReportFiller {

    public static void main(String[] args) {

        ff.setFileType(FileFormat.FILE_TYPE_PDF);
        PDFWriter pw = new PDFWriter(ff, basePath);

        pw.open(fileName, recordSize);
        Document document = pw.getDocument();
        document.setPageSize(PageSize.A4);

        pw.openFileForHeader();

        String accStr10[] = null;

        accStr10 = new String[] { "TESTING DATA", "", "", "", "", "",
                "Total Pages ", Integer.toString(totalPages), "", "",
                "\u0629\u062d\u0641\u0635\u0644\u0627 \u0645\u0642\u0631", "" };

        pw.setBorder = false;
        pw.setBold = true;
        pw.fontColour = PDFWriter.COLOUR_BLACK;
        pw.bgColour = PDFWriter.COLOUR_WHITE;
        pw.horAlignment = pw.ALIGN_LEFT;

        // ----------------------------------
        int totalPages = 1;
        totalPages = totalPages + ((recordSize + 5) / 12);

        Table headerTable = pw.getHeaderTable();
        headerTable.setBorder(Rectangle.BOTTOM);
        headerTable.setBorderColor(Color.WHITE);
        pw.writeStatementHeaderLine(accStr10, DataWriter.LINE_TYPE_GENERAL);
        headerPhrase.add(2, headerTable);

        HeaderFooter header = new HeaderFooter(headerPhrase, false);
        header.setAlignment(0);
        header.setBorder(Rectangle.NO_BORDER);
        document.setHeader(header);
        pw.openFile();

        pw.createEmptyLine();
        pw.commitEmptyLine();

        pw.close();

    }

    // Another method to write data in header, unable to put arabic text here
    public boolean writeStatementHeaderLine(String line[], int type)
            throws Exception {
        try {

            // Increment the current line number
            currentLineNo++;

            // Check if the text is not null or empty
            if (line == null || line.length == 0) {

                for (int i = 0; i < fileFormat.getFileColCount(); i++) {
                    chunk = new Chunk(" ", font);
                    Cell simpleCell = new Cell(new Phrase(chunk));
                    headerTable.addCell(simpleCell);
                }

                return false;
            }

            for (int i = 0; i < line.length; i++) {
                setFont();

                Cell simpleCell = null;
                if (line[i] == null) {
                    chunk = new Chunk("", font);
                    simpleCell = new Cell(new Phrase(chunk));
                } else if ((type == LINE_TYPE_GENERAL && i >= line.length - 2)) {
                    final String FONT = applicationContext
                            .getProperty("arabic.font.path");
                    font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,
                            BaseFont.EMBEDDED, 8);
                    if (line[i].equalsIgnoreCase("iban"))
                        setFont();
                    chunk = new Chunk(line[i], font);
                    simpleCell = new Cell(new Phrase(chunk));

                } else {
                    chunk = new Chunk(line[i], font);
                    if (type == LINE_TYPE_GENERAL) {
                        simpleCell = new Cell(new Phrase(chunk));
                    }

                }
                simpleCell.setBorder(Rectangle.NO_BORDER);

                if ((type == LINE_TYPE_GENERAL && i >= line.length - 2)) {
                    simpleCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    // simpleCell.rotate();

                }
                headerTable.addCell(simpleCell);
            }
        } catch (Exception e) {
            e.printStackTrace();
            deleteFile();
            e.printStackTrace();
            throw e;
        }

        return true;
    }

}

Требуется распечатать ветвь как "فرع شجرة" в таблице заголовков PDF, где она отображает "عرفلا".

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

Возможно, это не полное решение, но есть утилита, которая может вам очень помочь. Существует библиотека Java с открытым исходным кодом (написанная мной) под названием MgntUtils, в которой есть утилита, которая преобразует любую строку в последовательность Unicode и наоборот. Все, что вам нужно сделать, это:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello world");

И он вернет String "\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"

То же самое будет работать для любой строки на любом языке, включая специальные символы. Вот ссылка на статью Java-библиотека с открытым исходным кодом с фильтрацией трассировки стека, конвертер Unicode для анализа Silent String и сравнение версий , в котором объясняется, что такое библиотека и где ее можно получить (доступно как в Maven central и github . В статье ищем абзац: «String Unicode converter» .

0 голосов
/ 06 мая 2019

В конечном итоге это было достигнуто с помощью метода onEndPage PageEvent, приведенного ниже кода для справки

pw.openFile ();

        pw.writer.setPageEvent(new PdfPageEventHelper(){


            protected ApplicationContext applicationContext = ApplicationContext.getInstance();




            @Override
            public void onEndPage(PdfWriter writer, Document document)
            {


                PdfPTable table1=new PdfPTable(12);
                try{


                String accStr[] = null;
                String accStr10[] = null;

                accStr = new String[] { accountTitle ,"","","","","","Period Covered " ,startDate +" to " +endDate,"","","\u0645\u062f\u0629 \u0627\u0644\u062a\u063a\u0637\u064a\u0629",""};
                accStr10 = new String[] {address1 ,"","","","","","Page No ",Integer.toString(writer.getPageNumber()-1),"","","\u0631\u0642\u0645 \u0627\u0644\u0635\u0641\u062d\u0629",""};

                table1.setTotalWidth(522);
                float f[] = {45,10,0,0,0,0,25,35,0,0,20,0};
                table1.setWidths(f);

                pw.setBorder = true;
                pw.setBold = true;
                pw.fontColour = AccStmtPDFWriter.COLOUR_BLACK;
                pw.bgColour = AccStmtPDFWriter.COLOUR_WHITE;
                pw.horAlignment = pw.ALIGN_LEFT;
                PdfPCell pdfCell=null;

                //table1=pw.getTable1();



                if(!FieldNameUtil.isApplicableForBahrain){
                    pdfCell = new PdfPCell(new Phrase(new Chunk("")));
                    pdfCell.setBorder(0);
                    pdfCell.setColspan(12);             
                    table1.addCell(pdfCell);
                    table1=writeHeaderLine(accStr, DataWriter.LINE_TYPE_GENERAL,table1);
                    }

                    pdfCell = new PdfPCell(new Phrase(new Chunk("")));
                    pdfCell.setBorder(0);
                    pdfCell.setColspan(12);             
                    table1.addCell(pdfCell);
                    table1=writeHeaderLine(accStr10, DataWriter.LINE_TYPE_GENERAL,table1);


                table1.writeSelectedRows(0, -1, 57, 730, writer.getDirectContent());
                //document.add(table1);
                table1.deleteBodyRows();
                }catch(Exception e){
                    e.printStackTrace();
                }

            }

            public PdfPTable writeHeaderLine(String line[], int type,PdfPTable table2)
                    throws Exception {
                Chunk chunk = null;
                PdfPCell cell =null;
                PdfPTable tableNew =table2;
                Font font=FontFactory.getFont("Arial",8,Font.BOLD,Color.BLACK);
                try {



                    for (int i = 0; i < line.length; i++) {
                        //changed by shruti
                        if (line[i] == null)
                            chunk = new Chunk("", font);
                        else if(type==115 || (type==pw.LINE_TYPE_GENERAL && i>=line.length-2) || (type==112 && i==line.length-1)){  
                            final String FONT = applicationContext.getProperty("arabic.font.path");
                            font = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED,8);
                            if(line[i].equalsIgnoreCase("iban"))
                                font=FontFactory.getFont("Arial",8,Font.BOLD,Color.BLACK);
                            chunk = new Chunk(line[i], font);
                        }else
                            chunk = new Chunk(line[i], font);

                        cell = new PdfPCell(new Phrase(chunk));
                        cell.setBorder(Rectangle.NO_BORDER);
                        cell.setVerticalAlignment(Element.ALIGN_BOTTOM); 
                        if((type==pw.LINE_TYPE_GENERAL && i>=line.length-2)){
                            cell.setRunDirection(PdfWriter.RUN_DIRECTION_RTL);
                            cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
                            tableNew.addCell(cell);
                        }else{
                            tableNew.addCell(cell);
                        }

                    }

                    return tableNew;

                } catch (Exception e) {
                    e.printStackTrace();
                    throw e;
                }
                }




        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...