تبدیل متن طولانی فارسی به تصویر با رعایت چهارچوب و اعمال فونت دلخواه در php
۲ سال پیش(به روز شده در ۱ سال پیش) پی اچ پی(PHP)(کلاس) ۵
در یکی از پروژه ها نیاز بود تا متن فارسی به عکس تبدیل شود. متاسفانه منابع کمی در این مورد هستند و اینکه اکثر این منابع توانایی تبدیل یک متن طولانی به عکس آن هم در یک چهار چوب را ندارند. و مثال های آنها فقط برای چند کلمه یا یک خط بود. یکی از مزیتهای این کلاس افزودن فونت هست که زیبایی تبدیل کار را دوچندان میکند. البته این کلاس برای زبان انگلیسی نوشته شده بود و ما با تغییر اندک و اضافه کردن چند تابع مختصر آنرا برای متون فارسی بلند اصلاح کردیم. کلاس gd-text برای روی گیت هاب قابل دسترس هست.
نکته ای که لازم است قبل از استفاده بدانید روش محاسبه ی صفحه بندی است چرا که با توجه به اندازه قلم و نوع فونت طبیعتا بر روی محاسبه ی اندازه صفحه یا هر خط جهت برش برای ایجاد صفحه بعدی نیاز هست و بدلیل وقت کم برای این مورد فرمول دقیقی بدست نیاوردیم. و نیاز به آزمون و خطاست.
تغییر کوچکی که در کلاس gd-text اعمال شده در فایل Box.php و خط 274 است و چند خط کد زیر اضافه شده است. علت این اصلاحیه جهت رعایت راست چینش حروف در حالت راست چین هست چرا که بصورت پیشفرض چپ چین جهت تبدیل به عکس در نظر گرفته شده است.
$explode = explode(' ', $line); $newLine = ''; for ($i = count($explode) - 1; $i >= 0; $i--) { $newLine .= ' ' . $explode[$i]; } $line = $newLine;
پس اگر نسخه آخر این کلاس را جهت آپدیت در نظر گرفتید حتما نکته بالا رعایت شود.
نکته پیشنهادی دیگری نیز که در این تبدیل به چشم میخورد تبدیل متن فارسی به pdf است. البته کتابخانه های قدرتمندی برای این مورد هستند اما برای تعداد صفحه های بالا بسیار کند عمل میکنند که میتوان با تبدیل متون به عکس و قرار دادن تصاویر در فایل pdf با توجه به تست ما برای متون طولانی سرعت نتیجه گیری بسیار بالاتر خواهد بود.
5 نظر
سلام
با تشکر از مطلب مفیدتون
یه نکته این که وقتی در انتهای سطرها فاصله (اسپیس) نیست، کلمه آخر رو یه سطر پایین تر میاره. و نکته بعدی این که تابع gdText_persian_log2vis ایراد داره. نمی دونم سایتتون حذف می کنه یا نه، ولی خب اصلاح شده ش رو می فرستم:
function gdText_persian_log2vis($str) {
$bidi = new bidi();
$text = array_reverse(explode("\n", $str));
$str = array();
$str1 = array();
foreach ($text as $line) {
$chars = $bidi->utf8Bidi($bidi->UTF8StringToArray(implode(' ',array_reverse(explode(' ', $line)))), 'R');
$line = '';
foreach ($chars as $char)
$line .= $bidi->unichr($char);
$str[] = $line;
}
for ($i = count($str) - 1; $i >= 0; $i--) {
$str1[] = $str[$i];
}
return implode("\n", $str1);
}
سلام. ممنون از توجه شما. حتما برنامه نویسهای دیگه از اصلاح شما استفاده میکنن.
سلام یه ایراد جزئی هم این تابع داشت کلمه آخر هر پاراگراف توی خط جدید نمایش داده می شد من این خط های اضافه رو پاک کردم
function gdText_persian_log2vis($str) {
$bidi = new bidi();
$text = array_reverse(explode("\n", $str));
$str = array();
$str1 = array();
foreach ($text as $line) {
$chars = $bidi->utf8Bidi($bidi->UTF8StringToArray(implode(' ',array_reverse(explode(' ', $line)))), 'R');
$line = '';
foreach ($chars as $char)
$line .= $bidi->unichr($char);
$line = str_replace("\r","",$line);
$str[] = $line;
}
for ($i = count($str) - 1; $i >= 0; $i--) {
$str1[] = $str[$i];
}
return implode("\n", $str1);
}
سلام. ممنون از دقت شما.
سلام این دوستمون گفت این تغییرات ایجاد کنید من ایجاد کردم اما ارور داد ایا میشه خودتون فایل ادیت شدش بزارید داخل سایتتون؟