py-pdf / fpdf2

Simple PDF generation for Python
https://py-pdf.github.io/fpdf2/
GNU Lesser General Public License v3.0
1.13k stars 253 forks source link

"Troubleshooting Hindi Text Rendering in FPDF2 PDF Generation: Formatting Issues with Text Shaping" #1139

Closed mohindra9211 closed 8 months ago

mohindra9211 commented 8 months ago

When generating a PDF file using FPDF2 with Hindi fonts, I encountered difficulties in directly incorporating the text. To address this, I applied a text shaping function, which successfully converted the text into Hindi. However, the resulting paragraph did not retain its original format; some text overflowed into the next paragraph and justification was compromised. For further details and a visual representation, please refer to the attached file where I describe three scenarios.

Code

from fpdf import FPDF

# Hindi text (Unicode)
story_hindi = """एक बार की बात है, एक जंगल में एक शेर रहता था। वह बहुत ही डरावना और भयानक था। एक दिन उसने अपने दोस्त खरगोश से पूछा, "तुम्हें क्या लगता है, क्या मैं सबसे ताकतवर हूँ?"
खरगोश ने हँसते हुए कहा, "नहीं, तुम सबसे ताकतवर नहीं हो, तुम्हारी सामर्थ्य तुम्हारे भय के कारण ही है।" शेर को यह सुनकर गुस्सा आया और उसने खरगोश को कहा, "अगर तुम मुझसे इतने ही अच्छे हो, तो तुम भी इस जंगल के सबसे डरावने और भयानक जानवर के सामने जाओ।"खरगोश को उस चुनौती का सामना करना पड़ा, और उसने बड़े ही डर से कहा, "नहीं, मैं इस कदर बहादुर नहीं हूँ।"
शेर ने कहा, "यही तो मेरा कहने का मतलब है। हमें किसी को भी उसके द्वारा किये गए काम के लिए नहीं, बल्कि उसकी योग्यता के लिए मानना चाहिए।" इससे खरगोश ने सीख ली और उसने भी अपनी योग्यता के आधार पर अपने काम किए।""".strip() 

class PDF(FPDF):
    def header(self):
        self.add_font(family="Karma", style="B", fname="./static/font/Karma-Bold.ttf")
        self.add_font(family="Karma", style="", fname="./static/font/Karma-Regular.ttf")
        self.set_font('Karma', 'B', 12)

        self.set_text_shaping(True)
        self.cell(0, 10, 'हिंदी कहानी - शेर और खरगोश', new_x='LEFT', new_y='NEXT', align='L')
        self.set_text_shaping(False)

    def chapter_body(self, body):
        self.set_font('Karma', 'B', 10)  
        self.cell(0, 10, text="Without Text shapping", new_x='LEFT', new_y='NEXT', align='L')
        self.set_font('Karma', '', 10) 
        self.multi_cell(w = self.epw, h = 5, text = body, new_x='LEFT', new_y='NEXT', align="J")
        self.ln(5)

        self.set_font('Karma', 'B', 10) 
        self.cell(0, 10, text="With Text shapping", new_x='LEFT', new_y='NEXT', align='L')
        self.set_font('Karma', '', 10) 
        self.set_text_shaping(True)
        self.multi_cell(w = self.epw, h = 5, text = body, new_x='LEFT', new_y='NEXT', align="J")
        self.set_text_shaping(False)
        self.ln(5) 

        self.set_font('Karma', 'B', 10) 
        self.cell(0, 10, text=f'With Text shapping and direction="ltr", script="dev", language="hin"', new_x='LEFT', new_y='NEXT', align='L')
        self.set_font('Karma', '', 10) 
        self.set_text_shaping(True, features={"kern": True, "liga": True}, direction="ltr", script="dev", language="hin")
        self.multi_cell(w = self.epw, h = 5, text = body, new_x='LEFT', new_y='NEXT', align="J")
        self.set_text_shaping(False)
        self.ln(5)

pdf = PDF()
pdf.add_page()
pdf.set_auto_page_break(auto=True, margin=15)
pdf.chapter_body(story_hindi)
pdf.output('hindi_story.pdf')

Result hindi_story pdf - Adobe Acrobat Reader (64-bit) 27-03-2024 17_00_57

Environment Please provide the following information:

Lucas-C commented 8 months ago

Hi @mohindra9211

Thank you for this report.

I'm really not an expert with the text-shaping feature. Maybe @andersonhc or @gmischler could have some answers for you 🙂

mohindra9211 commented 8 months ago

Hello @Lucas-C,

I wanted to let you know that I've resolved my text shaping issue by updating to version 2.7.8 of fpdf2. I appreciate your response and for providing such a good and reliable library.

Thank you!

Result hindi_story pdf - Adobe Acrobat Reader (64-bit) 28-03-2024 10_54_31

Lucas-C commented 8 months ago

Great! I'm glad you could solve your issue @mohindra9211 🙂 Closing this issue now