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

Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersNicole Novielli
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 

Recently uploaded (20)

Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
A Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software DevelopersA Journey Into the Emotions of Software Developers
A Journey Into the Emotions of Software Developers
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 

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