SlideShare a Scribd company logo
1 of 53
REDMINE
PDF


   NAITOH Jun
  twitter: @naitoh
Defect #61 Broken character encoding in pdf export



Redmine                 PDF
Defect #61 Broken character encoding in pdf export



Redmine                 PDF


Defect #6506 PDF export broken with Japanese
(Gannt and Issue Tracking)
Redmine PDF library


Redmine
Redmine PDF library


Redmine



    RFPDF
    (Ruby)    NG
             NG
Redmine PDF library


Redmine



    RFPDF
    (Ruby)    NG
             NG


     FPDF
     (PHP)
Redmine PDF library


Redmine



    RFPDF
    (Ruby)           NG
                    NG
                          TCPDF
             fork          (PHP)
     FPDF
     (PHP)
Redmine PDF library


Redmine



    RFPDF
    (Ruby)           NG
                    NG
                            TCPDF
             fork            (PHP)
     FPDF
     (PHP)          UTF-8       Font
Redmine PDF library


Redmine
                                edwinmoss
                             RFPDF
                             (Ruby)
    RFPDF
    (Ruby)           NG
                    NG
                            TCPDF
             fork            (PHP)
     FPDF
     (PHP)          UTF-8       Font
Redmine PDF library


Redmine
                                edwinmoss
                             RFPDF
                                             OK
                             (Ruby)         NG
    RFPDF
    (Ruby)           NG
                    NG
                            TCPDF
             fork            (PHP)
     FPDF
     (PHP)          UTF-8       Font
Redmine PDF library

                          prawn
                          (Ruby)
Redmine
                                   edwinmoss
                               RFPDF
                                                OK
                               (Ruby)          NG
    RFPDF
    (Ruby)           NG
                    NG
                              TCPDF
             fork              (PHP)
     FPDF
     (PHP)          UTF-8          Font
Redmine PDF library
                          Ruby
                                                 OK
                                                  OK
                          prawn
                          (Ruby)
Redmine
                                     edwinmoss
                                  RFPDF
                                                   OK
                                  (Ruby)          NG
    RFPDF
    (Ruby)           NG
                    NG
                                 TCPDF
             fork                 (PHP)
     FPDF
     (PHP)          UTF-8            Font
Redmine PDF library
                             Ruby
                                                    OK
          API                                        OK
      PDF                    prawn
                             (Ruby)
Redmine
                                        edwinmoss
                                     RFPDF
                                                      OK
                                     (Ruby)          NG
    RFPDF
    (Ruby)              NG
                       NG
                                    TCPDF
                fork                 (PHP)
     FPDF
     (PHP)             UTF-8            Font
Redmine PDF library
                             Ruby
                                                    OK
          API                                        OK
      PDF                    prawn
                             (Ruby)
Redmine
                                        edwinmoss
          API
                                     RFPDF
                                                      OK
                                     (Ruby)          NG
    RFPDF
    (Ruby)              NG
                       NG
                                    TCPDF
                fork                 (PHP)
     FPDF
     (PHP)             UTF-8            Font
Redmine PDF library
                             Ruby
                                                    OK
          API                                        OK
      PDF                    prawn
                             (Ruby)
Redmine
                                        edwinmoss
          API
                                     RFPDF
       4
    RFPDF
                                         …
                                     (Ruby)
                                                      OK
                                                     NG
     (Ruby)             NG
                       NG
                                    TCPDF
                fork                 (PHP)
     FPDF
     (PHP)             UTF-8            Font
RFPDF
def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil)
RFPDF
     def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil)

                           w:

h:
RFPDF
     def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil)

                           w:

h:
RFPDF
     def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil)

                           w:

h:
RFPDF
     def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil)

                             w:
                                           ln=0
h:

        ln=1         ln=2




               ln:                         X,Y
      (0:             , 1:                         , 2:                )
RFPDF
def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)
RFPDF
     def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)

                          w:

h:
RFPDF
     def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)

                          w:

h:
RFPDF
     def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)

                            w:
                                         ln=0
h:




      ln=1          ln=2

              ln:                        X,Y
     (0:             , 1:                        , 2:              )
RFPDF
     def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)

                            w:
                                         ln=0
h:




      ln=1          ln=2

              ln:                        X,Y
     (0:             , 1:                        , 2:              )
RFPDF
     def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)

                            w:
                                         ln=0           Cell
h:




      ln=1          ln=2

              ln:                        X,Y
     (0:             , 1:                        , 2:              )
RFPDF
     def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)

                            w:
                                         ln=0           Cell
h:


                                                                       byte

      ln=1          ln=2

              ln:                        X,Y
     (0:             , 1:                        , 2:              )
RFPDF
     def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)

                            w:
                                         ln=0           Cell
h:


                                                                       byte

      ln=1          ln=2

              ln:                        X,Y
     (0:             , 1:                        , 2:              )
RFPDF
     def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)

                            w:
                                         ln=0           Cell
h:


                                                                       byte

      ln=1          ln=2

              ln:                        X,Y
     (0:             , 1:                        , 2:              )
Redmine




                 RFPDF



                          GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
Redmine




                 RFPDF
                             MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
Redmine


pdf.rb (UTF-8)
                             Cell(iconv)

                 RFPDF
                             MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
Redmine


pdf.rb (UTF-8)
                             Cell(iconv)
                UTF-8
                 RFPDF
                             MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
Redmine


pdf.rb (UTF-8)
                             Cell(iconv)
                UTF-8            UTF-8
                 RFPDF
                             MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
Redmine


pdf.rb (UTF-8)
                             Cell(iconv)
                UTF-8            UTF-8
                 RFPDF
                             MultiCell
                                       X   2byte
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
Redmine


pdf.rb (UTF-8)
                             Cell(iconv)
                UTF-8            UTF-8
                 RFPDF
                             MultiCell
                                       X   2byte
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth   Shift_JIS
fpdf.rb(1byte     )          MultiCell
                                Cell
Redmine


pdf.rb (UTF-8)
                             Cell(iconv)
               UTF-8             UTF-8
                RFPDF
                             MultiCell
                                       X   2byte
japanese.rb (Shift_JIS)
                          GetStringWidth

            Shift_JIS     GetStringWidth   Shift_JIS
fpdf.rb(1byte     )          MultiCell
                                Cell
PDF
                Redmine




                 RFPDF
                             MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
PDF
                Redmine

                      RDMMultiCell(iconv)
pdf.rb (UTF-8)
                      RDMCell(iconv)

                 RFPDF
                              MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )           MultiCell
                                 Cell
PDF
                Redmine
             UTF-8
                      RDMMultiCell(iconv)
pdf.rb (UTF-8)
                      RDMCell(iconv)

                 RFPDF
                              MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )           MultiCell
                                 Cell
PDF
                Redmine
             UTF-8
                      RDMMultiCell(iconv)
pdf.rb (UTF-8)
                      RDMCell(iconv)
                                            Shift_JIS
                 RFPDF
                              MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

                          GetStringWidth
fpdf.rb(1byte     )           MultiCell
                                 Cell
PDF
               Redmine
             UTF-8
                     RDMMultiCell(iconv)
pdf.rb (UTF-8)
                     RDMCell(iconv)
                                           Shift_JIS
                 RFPDF
                             MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

            Shift_JIS     GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
PDF
               Redmine
             UTF-8
                     RDMMultiCell(iconv)
pdf.rb (UTF-8)
                     RDMCell(iconv)
                                           Shift_JIS
                 RFPDF
                             MultiCell
japanese.rb (Shift_JIS)
                          GetStringWidth

            Shift_JIS     GetStringWidth
fpdf.rb(1byte     )          MultiCell
                                Cell
Redmine
            UTF-8
                    RDMMultiCell(iconv)
pdf.rb (UTF-8)
                    RDMCell(iconv)
                                          Shift_JIS
                 RFPDF
japanese.rb (Shift_JIS)    MultiCell
(fpdf)                  GetStringWidth

            Shift_JIS   GetStringWidth
fpdf.rb(1byte     )         MultiCell
                               Cell
Redmine
            UTF-8
                     RDMMultiCell(iconv)
pdf.rb (UTF-8)
                     RDMCell(iconv)
                                           Shift_JIS
                 RFPDF
japanese.rb (Shift_JIS)    MultiCell
(fpdf)                  GetStringWidth

             Shift_JIS   GetStringWidth
tcpdf.rb(String ) )
fpdf.rb(1byte                MultiCell
              Font              Cell
Redmine      general_pdf_encoding != UTF-8
            UTF-8
                     RDMMultiCell(iconv)
pdf.rb (UTF-8)
                     RDMCell(iconv)
                                              Shift_JIS
                 RFPDF
japanese.rb (Shift_JIS)    MultiCell
(fpdf)                  GetStringWidth

             Shift_JIS   GetStringWidth
tcpdf.rb(String ) )
fpdf.rb(1byte                MultiCell
              Font              Cell
Redmine        general_pdf_encoding != UTF-8
            UTF-8
                       RDMMultiCell(iconv)
pdf.rb (UTF-8)
                       RDMCell(iconv)

                 RFPDF
japanese.rb (Shift_JIS)    MultiCell
(fpdf)                  GetStringWidth

                           GetStringWidth
tcpdf.rb(String    )           MultiCell
              Font                Cell
Redmine        general_pdf_encoding == UTF-8
                             general_pdf_encoding != UTF-8
            UTF-8
                       RDMMultiCell
                       RDMMultiCell(iconv)
pdf.rb (UTF-8)
                       RDMCell
                       RDMCell(iconv)

                 RFPDF
japanese.rb (Shift_JIS)    MultiCell
(fpdf)                  GetStringWidth

                           GetStringWidth
tcpdf.rb(String    )           MultiCell
              Font                Cell
Redmine        general_pdf_encoding == UTF-8
                             general_pdf_encoding != UTF-8
            UTF-8
                       RDMMultiCell
                       RDMMultiCell(iconv)
pdf.rb (UTF-8)
                       RDMCell
                       RDMCell(iconv)
                                                  UTF-8
                 RFPDF
japanese.rb (Shift_JIS)    MultiCell
(fpdf)                  GetStringWidth

                           GetStringWidth
tcpdf.rb(String    )           MultiCell
              Font                Cell
Redmine        general_pdf_encoding == UTF-8
                             general_pdf_encoding != UTF-8
            UTF-8
                       RDMMultiCell
                       RDMMultiCell(iconv)
pdf.rb (UTF-8)
                       RDMCell
                       RDMCell(iconv)
                                                  UTF-8
                 RFPDF
japanese.rb (Shift_JIS)    MultiCell
(fpdf)                  GetStringWidth

              UTF-8        GetStringWidth
tcpdf.rb(String    )           MultiCell
              Font                Cell
Redmine        general_pdf_encoding == UTF-8
                             general_pdf_encoding != UTF-8
            UTF-8
                       RDMMultiCell
                       RDMMultiCell(iconv)
pdf.rb (UTF-8)
                       RDMCell
                       RDMCell(iconv)
                                                  UTF-8
                 RFPDF
japanese.rb (Shift_JIS)    MultiCell
(fpdf)                  GetStringWidth

              UTF-8        GetStringWidth
tcpdf.rb(String    )           MultiCell
              Font                Cell
RTL(Right-To-Left)
UTF-8             Font        Font
               Kbyte
        Font
        (Table Of Contents)

More Related Content

More from Jun Naitoh

More from Jun Naitoh (20)

Redmine.tokyo23 questionnaire
Redmine.tokyo23 questionnaireRedmine.tokyo23 questionnaire
Redmine.tokyo23 questionnaire
 
Redmine.tokyo22 questionnaire
Redmine.tokyo22 questionnaireRedmine.tokyo22 questionnaire
Redmine.tokyo22 questionnaire
 
Redmine.tokyo21 questionnaire
Redmine.tokyo21 questionnaireRedmine.tokyo21 questionnaire
Redmine.tokyo21 questionnaire
 
Redmine.tokyo 20 questionnaire
Redmine.tokyo 20 questionnaireRedmine.tokyo 20 questionnaire
Redmine.tokyo 20 questionnaire
 
Redmine.tokyo 19 questionnaire
 Redmine.tokyo 19 questionnaire Redmine.tokyo 19 questionnaire
Redmine.tokyo 19 questionnaire
 
Redmine.tokyo 18 questionnaire
 Redmine.tokyo 18 questionnaire Redmine.tokyo 18 questionnaire
Redmine.tokyo 18 questionnaire
 
Redmine.tokyo 17 questionnaire
Redmine.tokyo 17 questionnaireRedmine.tokyo 17 questionnaire
Redmine.tokyo 17 questionnaire
 
Redmine.tokyo 16 questionnaire
Redmine.tokyo 16 questionnaireRedmine.tokyo 16 questionnaire
Redmine.tokyo 16 questionnaire
 
RubyData Tokyo Meetup 2018 naitoh
RubyData Tokyo Meetup 2018 naitohRubyData Tokyo Meetup 2018 naitoh
RubyData Tokyo Meetup 2018 naitoh
 
Redmine.tokyo 15 questionnaire
 Redmine.tokyo 15 questionnaire Redmine.tokyo 15 questionnaire
Redmine.tokyo 15 questionnaire
 
Redmine.tokyo 14 questionnaire
 Redmine.tokyo 14 questionnaire Redmine.tokyo 14 questionnaire
Redmine.tokyo 14 questionnaire
 
Redmine.tokyo 13 questionnaire
Redmine.tokyo 13 questionnaireRedmine.tokyo 13 questionnaire
Redmine.tokyo 13 questionnaire
 
Reject kaigi2017 naitoh
Reject kaigi2017 naitohReject kaigi2017 naitoh
Reject kaigi2017 naitoh
 
Redmine 310 320_new_feature
Redmine 310 320_new_featureRedmine 310 320_new_feature
Redmine 310 320_new_feature
 
Redmine.tokyo 09 questionnaire
Redmine.tokyo 09 questionnaireRedmine.tokyo 09 questionnaire
Redmine.tokyo 09 questionnaire
 
Redmine 300 310_new_feature
Redmine 300 310_new_featureRedmine 300 310_new_feature
Redmine 300 310_new_feature
 
Redmine.tokyo 08 questionnaire
Redmine.tokyo 08 questionnaireRedmine.tokyo 08 questionnaire
Redmine.tokyo 08 questionnaire
 
Redmine 260 300_new_feature
Redmine 260 300_new_featureRedmine 260 300_new_feature
Redmine 260 300_new_feature
 
Redmine.tokyo 07 open_discussion
Redmine.tokyo 07 open_discussionRedmine.tokyo 07 open_discussion
Redmine.tokyo 07 open_discussion
 
Redmine.tokyo 07 questionnaire
Redmine.tokyo 07 questionnaireRedmine.tokyo 07 questionnaire
Redmine.tokyo 07 questionnaire
 

Recently uploaded

CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
Earley Information Science
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Recently uploaded (20)

The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 

Redmine pdf export.key

  • 1. REDMINE PDF NAITOH Jun twitter: @naitoh
  • 2.
  • 3. Defect #61 Broken character encoding in pdf export Redmine PDF
  • 4. Defect #61 Broken character encoding in pdf export Redmine PDF Defect #6506 PDF export broken with Japanese (Gannt and Issue Tracking)
  • 6. Redmine PDF library Redmine RFPDF (Ruby) NG NG
  • 7. Redmine PDF library Redmine RFPDF (Ruby) NG NG FPDF (PHP)
  • 8. Redmine PDF library Redmine RFPDF (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP)
  • 9. Redmine PDF library Redmine RFPDF (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP) UTF-8 Font
  • 10. Redmine PDF library Redmine edwinmoss RFPDF (Ruby) RFPDF (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP) UTF-8 Font
  • 11. Redmine PDF library Redmine edwinmoss RFPDF OK (Ruby) NG RFPDF (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP) UTF-8 Font
  • 12. Redmine PDF library prawn (Ruby) Redmine edwinmoss RFPDF OK (Ruby) NG RFPDF (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP) UTF-8 Font
  • 13. Redmine PDF library Ruby OK OK prawn (Ruby) Redmine edwinmoss RFPDF OK (Ruby) NG RFPDF (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP) UTF-8 Font
  • 14. Redmine PDF library Ruby OK API OK PDF prawn (Ruby) Redmine edwinmoss RFPDF OK (Ruby) NG RFPDF (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP) UTF-8 Font
  • 15. Redmine PDF library Ruby OK API OK PDF prawn (Ruby) Redmine edwinmoss API RFPDF OK (Ruby) NG RFPDF (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP) UTF-8 Font
  • 16. Redmine PDF library Ruby OK API OK PDF prawn (Ruby) Redmine edwinmoss API RFPDF 4 RFPDF … (Ruby) OK NG (Ruby) NG NG TCPDF fork (PHP) FPDF (PHP) UTF-8 Font
  • 17. RFPDF def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil)
  • 18. RFPDF def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil) w: h:
  • 19. RFPDF def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil) w: h:
  • 20. RFPDF def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil) w: h:
  • 21. RFPDF def Cell(w, h, txt, border=0, ln=0, align='', fill=0, link=nil) w: ln=0 h: ln=1 ln=2 ln: X,Y (0: , 1: , 2: )
  • 22. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1)
  • 23. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) w: h:
  • 24. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) w: h:
  • 25. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) w: ln=0 h: ln=1 ln=2 ln: X,Y (0: , 1: , 2: )
  • 26. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) w: ln=0 h: ln=1 ln=2 ln: X,Y (0: , 1: , 2: )
  • 27. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) w: ln=0 Cell h: ln=1 ln=2 ln: X,Y (0: , 1: , 2: )
  • 28. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) w: ln=0 Cell h: byte ln=1 ln=2 ln: X,Y (0: , 1: , 2: )
  • 29. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) w: ln=0 Cell h: byte ln=1 ln=2 ln: X,Y (0: , 1: , 2: )
  • 30. RFPDF def MultiCell(w, h, txt, border=0, align='J', fill=0, ln=1) w: ln=0 Cell h: byte ln=1 ln=2 ln: X,Y (0: , 1: , 2: )
  • 31. Redmine RFPDF GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 32. Redmine RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 33. Redmine pdf.rb (UTF-8) Cell(iconv) RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 34. Redmine pdf.rb (UTF-8) Cell(iconv) UTF-8 RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 35. Redmine pdf.rb (UTF-8) Cell(iconv) UTF-8 UTF-8 RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 36. Redmine pdf.rb (UTF-8) Cell(iconv) UTF-8 UTF-8 RFPDF MultiCell X 2byte japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 37. Redmine pdf.rb (UTF-8) Cell(iconv) UTF-8 UTF-8 RFPDF MultiCell X 2byte japanese.rb (Shift_JIS) GetStringWidth GetStringWidth Shift_JIS fpdf.rb(1byte ) MultiCell Cell
  • 38. Redmine pdf.rb (UTF-8) Cell(iconv) UTF-8 UTF-8 RFPDF MultiCell X 2byte japanese.rb (Shift_JIS) GetStringWidth Shift_JIS GetStringWidth Shift_JIS fpdf.rb(1byte ) MultiCell Cell
  • 39. PDF Redmine RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 40. PDF Redmine RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 41. PDF Redmine UTF-8 RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 42. PDF Redmine UTF-8 RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) Shift_JIS RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 43. PDF Redmine UTF-8 RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) Shift_JIS RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth Shift_JIS GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 44. PDF Redmine UTF-8 RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) Shift_JIS RFPDF MultiCell japanese.rb (Shift_JIS) GetStringWidth Shift_JIS GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 45. Redmine UTF-8 RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) Shift_JIS RFPDF japanese.rb (Shift_JIS) MultiCell (fpdf) GetStringWidth Shift_JIS GetStringWidth fpdf.rb(1byte ) MultiCell Cell
  • 46. Redmine UTF-8 RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) Shift_JIS RFPDF japanese.rb (Shift_JIS) MultiCell (fpdf) GetStringWidth Shift_JIS GetStringWidth tcpdf.rb(String ) ) fpdf.rb(1byte MultiCell Font Cell
  • 47. Redmine general_pdf_encoding != UTF-8 UTF-8 RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) Shift_JIS RFPDF japanese.rb (Shift_JIS) MultiCell (fpdf) GetStringWidth Shift_JIS GetStringWidth tcpdf.rb(String ) ) fpdf.rb(1byte MultiCell Font Cell
  • 48. Redmine general_pdf_encoding != UTF-8 UTF-8 RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell(iconv) RFPDF japanese.rb (Shift_JIS) MultiCell (fpdf) GetStringWidth GetStringWidth tcpdf.rb(String ) MultiCell Font Cell
  • 49. Redmine general_pdf_encoding == UTF-8 general_pdf_encoding != UTF-8 UTF-8 RDMMultiCell RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell RDMCell(iconv) RFPDF japanese.rb (Shift_JIS) MultiCell (fpdf) GetStringWidth GetStringWidth tcpdf.rb(String ) MultiCell Font Cell
  • 50. Redmine general_pdf_encoding == UTF-8 general_pdf_encoding != UTF-8 UTF-8 RDMMultiCell RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell RDMCell(iconv) UTF-8 RFPDF japanese.rb (Shift_JIS) MultiCell (fpdf) GetStringWidth GetStringWidth tcpdf.rb(String ) MultiCell Font Cell
  • 51. Redmine general_pdf_encoding == UTF-8 general_pdf_encoding != UTF-8 UTF-8 RDMMultiCell RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell RDMCell(iconv) UTF-8 RFPDF japanese.rb (Shift_JIS) MultiCell (fpdf) GetStringWidth UTF-8 GetStringWidth tcpdf.rb(String ) MultiCell Font Cell
  • 52. Redmine general_pdf_encoding == UTF-8 general_pdf_encoding != UTF-8 UTF-8 RDMMultiCell RDMMultiCell(iconv) pdf.rb (UTF-8) RDMCell RDMCell(iconv) UTF-8 RFPDF japanese.rb (Shift_JIS) MultiCell (fpdf) GetStringWidth UTF-8 GetStringWidth tcpdf.rb(String ) MultiCell Font Cell
  • 53. RTL(Right-To-Left) UTF-8 Font Font Kbyte Font (Table Of Contents)

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n