Поддержка tFPDF на арабском языке (на основе fpdf) - PullRequest
0 голосов
/ 26 июня 2019

Я использую tFPDF (ссылка ниже). Я не могу найти способ сделать текст вправо -> влево для арабского языка. Это делает хорошо, но это слева направо. Ниже библиотека, которую я использую. Я посмотрел на исходный код и не мог понять, как сделать справа налево.

http://www.fpdf.org/en/script/script92.php

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

Редактировать

Наконец-то я получил ее с той же библиотекой, которую вы использовали

файл ex.php будет выглядеть так:

<?php

// Optionally define the filesystem path to your system fonts
// otherwise tFPDF will use [path to tFPDF]/font/unifont/ directory
// define("_SYSTEM_TTFONTS", "C:/Windows/Fonts/");

require('tfpdf.php');

$pdf = new tFPDF();
$pdf->AddPage();

// Add a Unicode font (uses UTF-8)
$pdf->AddFont('DejaVu','','DejaVuSansCondensed.ttf',true);
$pdf->SetFont('DejaVu','',14);

// Load a UTF-8 string from a file and print it

$file = fopen("HelloWorld.txt", "r");
while(!feof($file))
{
  $pdf->Write(8,utf8_strrev(fgets($file)));
}
fclose($file);


// Select a standard font (uses windows-1252)
$pdf->SetFont('Arial','',14);
$pdf->Ln(10);
$pdf->Write(5,'The file size of this PDF is only 13 KB.');

$pdf->Output();

function utf8_strrev($str){
 preg_match_all('/./us', $str, $ar);
 return implode(array_reverse($ar[0]));
}
?>

HelloWorld.txt:

ثتشر  ققققققققق
ثتشر  قثتقققققققق

и pdf:

Pdf File

Вы пытались использовать юникод справа налево?

Old Edit, альтернатива Python

После попытки использовать символ Юникод справа налево, он не работал, потому что скрипт, используемый de OP, записывает символ char в объект с именем Cell. Обходной будет установлен арабский шрифт. Но ...... Dejavu Fonts не поддерживает арабские шрифты, среди прочих:

  • Иврит
  • 1035 * Письмо нко *
  • Лао
  • Канадская аборигенная программа
  • Ogham
  • Тифинаг
  • лиса

Боюсь сказать, что если вы будете использовать эту библиотеку, как она есть, вы не решите проблему.

Но! Учитывая, что вы не указали fpdf, используемый на другом языке, Я нашел работу с той же самой библиотекой в ​​ядре, но сделанной на python:

#!/usr/bin/env python
# -*- coding: utf8 -*-

from fpdf import FPDF

pdf = FPDF()
pdf.add_page()

pdf.add_font('DejaVu', '', 'DejaVuSansCondensed.ttf', uni=True)
pdf.set_font('DejaVu', '', 14)

text = u"""
Arabic:  
ححبا العاالعاللا العاالعالل
حححبا العاالعاللا العاالعالل
"""

for txt in text.split('\n'):
    pdf.write(8, txt[::-1])
    pdf.ln(8)

pdf.output("unicode.pdf", 'F')

Вам просто нужно повернуть строку перед тем, как записать ее в теле, она будет выглядеть так:

enter image description here

Как это использовать:

Вот проект git

importante !: я пробовал в Python 2.7

Вы можете установить его с помощью pip:

pip install fpdf

и наконец: и САМОЕ ВАЖНОЕ

Я потерял два часа своей жизни, потому что я использую Ubuntu 18.04, поэтому библиотека fpdf искала шрифты UTF-8 в

FPDF_FONT_DIR = os.path.join(os.path.dirname(__file__),'font')

в моем случае:

/home/damian/.local/lib/python2.7/site-packages/fpdf/font

ПОЭТОМУ УБЕДИТЕСЬ, ЧТОБЫ СДЕЛАТЬ СВОИ ШРИФТЫ, ИЛИ ВЫ ПОТЕРЯЕТЕ УМ.

Во всяком случае, я надеюсь, что

1 голос
/ 18 июля 2019

К сожалению, было бы слишком сложно заставить библиотеку tFPDF работать на арабском языке.Эта библиотека поддерживает только арабские символы в их изолированной форме, вместо использования их начальной, средней или конечной формы, когда они находятся в начальной, средней или конечной позиции в слове.См. Документ «Требования к макету текста для арабского алфавита» от W3C.

Более того, он не поддерживает истинную двунаправленность.Взгляните на документ «Основы двунаправленного алгоритма Unicode» , также W3C.

Я предлагаю использовать другую библиотеку.Единственная некоммерческая библиотека PHP, поддерживающая RTL (справа налево) скрипты, которую мне удалось найти, это TCPDF .Исходный код находится на GitHub.Он основан на библиотеке fpdf, как и tFPDF.

Чтобы попробовать, все, что вам нужно сделать, это

git clone https://github.com/tecnickcom/TCPDF.git
cd TCPDF/examples
# this is an example of an RTL script:
php example_018.php > example_018.pdf
open example_018.pdf

Начиная с файлов примеров, которые я собрал, следующий пример для арабского языка(должен быть помещен в каталог examples):

<?php
require_once('tcpdf_include.php');
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Walter Tross');
$pdf->SetTitle('TCPDF Arabic Example');
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$lg = Array();
$lg['a_meta_charset'] = 'UTF-8';
$lg['a_meta_dir'] = 'rtl';
$lg['a_meta_language'] = 'ar'; // 'ar' for Arabic
$lg['w_page'] = 'page';
$pdf->setLanguageArray($lg);
$pdf->SetFont('dejavusans', '', 12); // several fonts in TCPDF/fonts work
$pdf->AddPage();
$txt = <<<EOD
مرحبا يا عالم
hello world
EOD;
$pdf->setRTL(true); // optional here, depends on the desired BASE direction
$pdf->Write(0, $txt, '', 0, 'C', true, 0, false, false, 0); // 'C' for centered
$pdf->Output('hello_world_in_Arabic.pdf', 'I');

Это то, что отображается в центральной части полученного PDF:

По какой-то причине у меня нет времени для расследования, теперь вы должны перенаправить вывод в файл, как с example_018.pdf выше, но я уверен, что это можно решить.(Для быстрого взлома было бы использовать выходную буферизацию .)

Вместо включения tcpdf_include.php, которое, в свою очередь, включает в себя все, что необходимо и многое другое, вам придется найти разумныйместо для того, что вам действительно нужно, и разумный способ включить только это.

И, конечно, вам придется немного изучить примеры, чтобы собрать код, который работаетдля вас.

PS: Я взял перевод "hello world" из записи Wikipedia для языка программирования قلب .

...