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

Redmine.tokyo23 questionnaire
Redmine.tokyo23 questionnaireRedmine.tokyo23 questionnaire
Redmine.tokyo23 questionnaireJun Naitoh
 
Redmine.tokyo22 questionnaire
Redmine.tokyo22 questionnaireRedmine.tokyo22 questionnaire
Redmine.tokyo22 questionnaireJun Naitoh
 
Redmine.tokyo21 questionnaire
Redmine.tokyo21 questionnaireRedmine.tokyo21 questionnaire
Redmine.tokyo21 questionnaireJun Naitoh
 
Redmine.tokyo 20 questionnaire
Redmine.tokyo 20 questionnaireRedmine.tokyo 20 questionnaire
Redmine.tokyo 20 questionnaireJun Naitoh
 
Redmine.tokyo 19 questionnaire
 Redmine.tokyo 19 questionnaire Redmine.tokyo 19 questionnaire
Redmine.tokyo 19 questionnaireJun Naitoh
 
Redmine.tokyo 18 questionnaire
 Redmine.tokyo 18 questionnaire Redmine.tokyo 18 questionnaire
Redmine.tokyo 18 questionnaireJun Naitoh
 
Redmine.tokyo 17 questionnaire
Redmine.tokyo 17 questionnaireRedmine.tokyo 17 questionnaire
Redmine.tokyo 17 questionnaireJun Naitoh
 
Redmine.tokyo 16 questionnaire
Redmine.tokyo 16 questionnaireRedmine.tokyo 16 questionnaire
Redmine.tokyo 16 questionnaireJun Naitoh
 
RubyData Tokyo Meetup 2018 naitoh
RubyData Tokyo Meetup 2018 naitohRubyData Tokyo Meetup 2018 naitoh
RubyData Tokyo Meetup 2018 naitohJun Naitoh
 
Redmine.tokyo 15 questionnaire
 Redmine.tokyo 15 questionnaire Redmine.tokyo 15 questionnaire
Redmine.tokyo 15 questionnaireJun Naitoh
 
Redmine.tokyo 14 questionnaire
 Redmine.tokyo 14 questionnaire Redmine.tokyo 14 questionnaire
Redmine.tokyo 14 questionnaireJun Naitoh
 
Redmine.tokyo 13 questionnaire
Redmine.tokyo 13 questionnaireRedmine.tokyo 13 questionnaire
Redmine.tokyo 13 questionnaireJun Naitoh
 
Reject kaigi2017 naitoh
Reject kaigi2017 naitohReject kaigi2017 naitoh
Reject kaigi2017 naitohJun Naitoh
 
Redmine 310 320_new_feature
Redmine 310 320_new_featureRedmine 310 320_new_feature
Redmine 310 320_new_featureJun Naitoh
 
Redmine.tokyo 09 questionnaire
Redmine.tokyo 09 questionnaireRedmine.tokyo 09 questionnaire
Redmine.tokyo 09 questionnaireJun Naitoh
 
Redmine 300 310_new_feature
Redmine 300 310_new_featureRedmine 300 310_new_feature
Redmine 300 310_new_featureJun Naitoh
 
Redmine.tokyo 08 questionnaire
Redmine.tokyo 08 questionnaireRedmine.tokyo 08 questionnaire
Redmine.tokyo 08 questionnaireJun Naitoh
 
Redmine 260 300_new_feature
Redmine 260 300_new_featureRedmine 260 300_new_feature
Redmine 260 300_new_featureJun Naitoh
 
Redmine.tokyo 07 open_discussion
Redmine.tokyo 07 open_discussionRedmine.tokyo 07 open_discussion
Redmine.tokyo 07 open_discussionJun Naitoh
 
Redmine.tokyo 07 questionnaire
Redmine.tokyo 07 questionnaireRedmine.tokyo 07 questionnaire
Redmine.tokyo 07 questionnaireJun 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

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?Igalia
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
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 2024The Digital Insurer
 
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)wesley chun
 
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 AutomationSafe Software
 
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 2024The Digital Insurer
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
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 slidevu2urc
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
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.pptxHampshireHUG
 
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 Servicegiselly40
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 

Recently uploaded (20)

Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
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
 
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)
 
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
 
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
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
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
 
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
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 

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