حروف فارسی یا عربی در PDF جدا از هم یا برعکس درمی‌آیند

پاسخ کوتاه

حروف فارسی بسته به حرف کناری شکلشان عوض می‌شود و متن از راست به چپ نوشته می‌شود. اگر ابزار ساخت PDF متن را چپ‌به‌راست بچیند یا حروف را تک‌تک بکشد، حروف جدا و با ترتیب برعکس می‌بینید. در Pandoc گزینه‌های -V dir=rtl -V lang=fa را همراه یک فونت دارای حروف فارسی اضافه کنید؛ در ابزارهای مبتنی بر HTML مقدار dir="rtl" را بگذارید و هرگز letter-spacing را روی متن فارسی اعمال نکنید.

مشکل، بازتولیدشده

خروجی Pandoc با xelatex و حروف عربی برعکس
Pandoc 3.5 با xelatex و فقط -V mainfont="Segoe UI": کلمه‌ها برعکس درمی‌آیند و سطر فارسی به‌هم‌ریخته است.
خروجی Pandoc با lualatex و ترتیب نادرست حروف
Pandoc 3.5 با lualatex (رندرکننده پیش‌فرض): همان سند، باز هم چپ‌به‌راست.

علت

  • جهت متن (bidi): بدون تنظیم راست‌به‌چپ، سطر از چپ به راست چیده می‌شود و کلمه‌ها و حروف برعکس دیده می‌شوند.
  • شکل‌دهی حروف: هر حرف فارسی شکل جدا، آغازی، میانی و پایانی دارد. رندرکننده‌ای که متن را شکل‌دهی نکند (یا حروف را تک‌تک بکشد) فقط شکل جدای حروف را نشان می‌دهد.
  • letter-spacing همراه html2canvas: Chrome حتی با letter-spacing حروف را به هم می‌چسباند، اما html2canvas (که بسیاری از دکمه‌های «HTML به PDF» از آن استفاده می‌کنند) در این حالت حروف را تک‌تک می‌کشد و از هم جدا می‌شوند (پایین را ببینید).
متن عربی با و بدون letter-spacing در Chrome و html2canvas
آزموده: letter-spacing: 0.05em در Chrome اتصال‌ها را نگه می‌دارد، اما در html2canvas 1.4.1 آن‌ها را می‌شکند.

یک سند نمونه راست‌به‌چپ را باز کنید

باز کردن نمونه

راه‌حل در Pandoc (آزموده)

pandoc input.md -o output.pdf \
  --pdf-engine=xelatex \
  -V mainfont="Segoe UI" \
  -V dir=rtl -V lang=fa
خروجی Pandoc با xelatex و حروف درست
همان سند با -V dir=rtl: حروف چسبیده و راست‌به‌چپ.

برای فارسی lang=fa و برای اردو lang=ur بگذارید. هر فونتی که حروف عربی‌نویس دارد کار می‌کند؛ در لینوکس Noto Sans Arabic یا Vazirmatn.

راه‌حل در ابزارهای HTML و Chromium

خروجی md-to-pdf با پاراگراف عربی چپ‌چین
md-to-pdf 5.2.5: حروف می‌چسبند، اما پاراگراف چپ‌به‌راست چیده شده و نقطه پایانی و کلمه‌های انگلیسی جای اشتباه می‌افتند.
  • جهت را تعیین کنید: پاراگراف‌های راست‌به‌چپ را در <div dir="rtl">…</div> بگذارید، یا از <p dir="auto"> استفاده کنید تا هر پاراگراف جهت خودش را بگیرد.
  • letter-spacing را از CSS متن اصلی حذف کنید.
  • روی سرورها و ایمیج‌های Docker فونت فارسی نصب کنید (مثلاً fonts-noto-core در Debian/Ubuntu).
<div dir="rtl">

سلام دنیا. این یک متن فارسی است.

</div>

در MarkPDF

فارسی، عربی و اردو خودکار تشخیص داده می‌شوند: فونت Noto مناسب بارگذاری می‌شود و هر پاراگراف، فهرست، نقل‌قول و جدول جهت خود را از متن خودش می‌گیرد. سندهای ترکیبی فارسی و انگلیسی بدون هیچ نشانه‌گذاری اضافه درست کار می‌کنند.

پرسش‌های متداول

چرا متن در ویرایشگر درست است اما در PDF نه؟

ویرایشگرها و مرورگرها شکل‌دهی و جهت فارسی را خودکار انجام می‌دهند؛ بسیاری از ابزارهای ساخت PDF نیاز دارند جهت و زبان صریحاً تنظیم شود.

آیا فونت خاصی لازم است؟

هر فونتی که حروف عربی‌نویس و جدول‌های شکل‌دهی OpenType داشته باشد: Noto Sans Arabic، Vazirmatn، Segoe UI و Tahoma همه این‌ها را دارند.

عددها و کلمه‌های انگلیسی داخل متن فارسی چه می‌شوند؟

وقتی جهت راست‌به‌چپ تنظیم شده باشد، الگوریتم دوجهتی عددها و کلمه‌های لاتین را با ترتیب چپ‌به‌راست خودشان در سطر نگه می‌دارد.