Regarding my comment about base14 fonts you should create fonts this way:

doc->CreateFont( name.toLocal8Bit().data(), bold,
italic , false,
         PdfEncodingFactory::GlobalIdentityEncodingInstance(),
PdfFontCache::eFontCreationFlags_None );

Default is PdfFontCache::eFontCreationFlags_AutoSelectBase14 which will
create base14 font when font name is for example "Helvetica", "Courier" or
"Times-Roman" and this will not work well with identity encoding.

Also you would probably want to use font subsetting for your use case for
smaller pdf. I am not sure if this is working well in podofo 0.9.6:

PdfDocument::CreateFontSubset


On Fri, Dec 6, 2019 at 3:55 PM Michal Sudolsky <sudols...@gmail.com> wrote:

> Hi,
>
> Can you try with latest podofo?
> https://sourceforge.net/p/podofo/code/HEAD/tree/
>
> On Fri, Dec 6, 2019 at 3:52 PM Igor Mironchik <igor.mironc...@gmail.com>
> wrote:
>
>> Hi,
>>
>> Resend without attachment.
>>
>> Modified helloworld example has the same issue with spaces...
>>
>>
>> /***************************************************************************
>>  *   Copyright (C) 2006 by Dominik
>> Seichter                                *
>>  *   domseich...@web.de
>> *
>>  *
>> *
>>  *   This program is free software; you can redistribute it and/or
>> modify  *
>>  *   it under the terms of the GNU General Public License as published
>> by  *
>>  *   the Free Software Foundation; either version 2 of the License,
>> or     *
>>  *   (at your option) any later
>> version.                                   *
>>  *
>> *
>>  *   This program is distributed in the hope that it will be
>> useful,       *
>>  *   but WITHOUT ANY WARRANTY; without even the implied warranty
>> of        *
>>  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
>> the         *
>>  *   GNU General Public License for more
>> details.                          *
>>  *
>> *
>>  *   You should have received a copy of the GNU General Public
>> License     *
>>  *   along with this program; if not, write to
>> the                         *
>>  *   Free Software Foundation,
>> Inc.,                                       *
>>  *   59 Temple Place - Suite 330, Boston, MA  02111-1307,
>> USA.             *
>>
>>  ***************************************************************************/
>>
>>
>> /*
>>  * Include the standard headers for cout to write
>>  * some output to the console.
>>  */
>> #include <iostream>
>>
>> /*
>>  * Now include all podofo header files, to have access
>>  * to all functions of podofo and so that you do not have
>>  * to care about the order of includes.
>>  *
>>  * You should always use podofo.h and not try to include
>>  * the required headers on your own.
>>  */
>> #include <podofo/podofo.h>
>>
>> /*
>>  * All podofo classes are member of the PoDoFo namespace.
>>  */
>> using namespace PoDoFo;
>>
>> void PrintHelp()
>> {
>>     std::cout << "This is a example application for the PoDoFo PDF
>> library." << std::endl
>>               << "It creates a small PDF file containing the text >Hello
>> World!<" << std::endl
>>               << "Please see http://podofo.sf.net for more information"
>> << std::endl << std::endl;
>>     std::cout << "Usage:" << std::endl;
>>     std::cout << "  examplehelloworld [outputfile.pdf]" << std::endl <<
>> std::endl;
>> }
>>
>> void HelloWorld( const char* pszFilename )
>> {
>>     /*
>>      * PdfStreamedDocument is the class that can actually write a PDF
>> file.
>>      * PdfStreamedDocument is much faster than PdfDocument, but it is only
>>      * suitable for creating/drawing PDF files and cannot modify existing
>>      * PDF documents.
>>      *
>>      * The document is written directly to pszFilename while being
>> created.
>>      */
>>     PdfStreamedDocument document( pszFilename );
>>
>>     /*
>>      * PdfPainter is the class which is able to draw text and graphics
>>      * directly on a PdfPage object.
>>      */
>>     PdfPainter painter;
>>
>>     /*
>>      * This pointer will hold the page object later.
>>      * PdfSimpleWriter can write several PdfPage's to a PDF file.
>>      */
>>     PdfPage* pPage;
>>
>>     /*
>>      * A PdfFont object is required to draw text on a PdfPage using a
>> PdfPainter.
>>      * PoDoFo will find the font using fontconfig on your system and
>> embedd truetype
>>      * fonts automatically in the PDF file.
>>      */
>>     PdfFont* pFont;
>>
>>     try {
>>         /*
>>          * The PdfDocument object can be used to create new PdfPage
>> objects.
>>          * The PdfPage object is owned by the PdfDocument will also be
>> deleted automatically
>>          * by the PdfDocument object.
>>          *
>>          * You have to pass only one argument, i.e. the page size of the
>> page to create.
>>          * There are predefined enums for some common page sizes.
>>          */
>>         pPage = document.CreatePage( PdfPage::CreateStandardPageSize(
>> ePdfPageSize_A4 ) );
>>
>>         /*
>>          * If the page cannot be created because of an error (e.g.
>> ePdfError_OutOfMemory )
>>          * a NULL pointer is returned.
>>          * We check for a NULL pointer here and throw an exception using
>> the RAISE_ERROR macro.
>>          * The raise error macro initializes a PdfError object with a
>> given error code and
>>          * the location in the file in which the error ocurred and throws
>> it as an exception.
>>          */
>>         if( !pPage )
>>         {
>>             PODOFO_RAISE_ERROR( ePdfError_InvalidHandle );
>>         }
>>
>>         /*
>>          * Set the page as drawing target for the PdfPainter.
>>          * Before the painter can draw, a page has to be set first.
>>          */
>>         painter.SetPage( pPage );
>>
>>         /*
>>          * Create a PdfFont object using the font "Arial".
>>          * The font is found on the system using fontconfig and embedded
>> into the
>>          * PDF file. If Arial is not available, a default font will be
>> used.
>>          *
>>          * The created PdfFont will be deleted by the PdfDocument.
>>          */
>>         pFont = document.CreateFont( "Arial", true, true, false,
>>             PdfEncodingFactory::GlobalIdentityEncodingInstance() );
>>
>>         /*
>>          * If the PdfFont object cannot be allocated return an error.
>>          */
>>         if( !pFont )
>>         {
>>             PODOFO_RAISE_ERROR( ePdfError_InvalidHandle );
>>         }
>>
>>         /*
>>          * Set the font size
>>          */
>>         pFont->SetFontSize( 18.0 );
>>
>>         /*
>>          * Set the font as default font for drawing.
>>          * A font has to be set before you can draw text on
>>          * a PdfPainter.
>>          */
>>         painter.SetFont( pFont );
>>
>>         /*
>>          * You could set a different color than black to draw
>>          * the text.
>>          *
>>          * SAFE_OP( painter.SetColor( 1.0, 0.0, 0.0 ) );
>>          */
>>
>>         /*
>>          * Actually draw the line "Hello World!" on to the PdfPage at
>>          * the position 2cm,2cm from the top left corner.
>>          * Please remember that PDF files have their origin at the
>>          * bottom left corner. Therefore we substract the y coordinate
>>          * from the page height.
>>          *
>>          * The position specifies the start of the baseline of the text.
>>          *
>>          * All coordinates in PoDoFo are in PDF units.
>>          * You can also use PdfPainterMM which takes coordinates in
>> 1/1000th mm.
>>          *
>>          */
>>         painter.DrawText( 56.69, pPage->GetPageSize().GetHeight() - 56.69,
>>             PdfString(reinterpret_cast<const pdf_utf8*>("The book -
>> Книга")) );
>>
>>         /*
>>          * Tell PoDoFo that the page has been drawn completely.
>>          * This required to optimize drawing operations inside in PoDoFo
>>          * and has to be done whenever you are done with drawing a page.
>>          */
>>         painter.FinishPage();
>>
>>         /*
>>          * Set some additional information on the PDF file.
>>          */
>>         document.GetInfo()->SetCreator ( PdfString("examplahelloworld - A
>> PoDoFo test application") );
>>         document.GetInfo()->SetAuthor  ( PdfString("Dominik Seichter") );
>>         document.GetInfo()->SetTitle   ( PdfString("Hello World") );
>>         document.GetInfo()->SetSubject ( PdfString("Testing the PoDoFo
>> PDF Library") );
>>         document.GetInfo()->SetKeywords( PdfString("Test;PDF;Hello
>> World;") );
>>
>>         /*
>>          * The last step is to close the document.
>>          */
>>         document.Close();
>>     } catch ( PdfError & e ) {
>>         /*
>>          * All PoDoFo methods may throw exceptions
>>          * make sure that painter.FinishPage() is called
>>          * or who will get an assert in its destructor
>>          */
>>         try {
>>             painter.FinishPage();
>>         } catch( ... ) {
>>             /*
>>              * Ignore errors this time
>>              */
>>         }
>>
>>         throw e;
>>     }
>> }
>>
>> int main( int argc, char* argv[] )
>> {
>>     /*
>>      * Check if a filename was passed as commandline argument.
>>      * If more than 1 argument or no argument is passed,
>>      * a help message is displayed and the example application
>>      * will quit.
>>      */
>>     if( argc != 2 )
>>     {
>>         PrintHelp();
>>         return -1;
>>     }
>>
>>     /*
>>      * All podofo functions will throw an exception in case of an error.
>>      *
>>      * You should catch the exception to either fix it or report
>>      * back to the user.
>>      *
>>      * All exceptions podofo throws are objects of the class PdfError.
>>      * Thats why we simply catch PdfError objects.
>>      */
>>     try {
>>         /*
>>          * Call the drawing routing which will create a PDF file
>>          * with the filename of the output file as argument.
>>          */
>>          HelloWorld( argv[1] );
>>     } catch( PdfError & eCode ) {
>>         /*
>>          * We have to check if an error has occurred.
>>          * If yes, we return and print an error message
>>          * to the commandline.
>>          */
>>         eCode.PrintErrorMsg();
>>         return eCode.GetError();
>>     }
>>
>>
>>     try {
>>         /**
>>          * Free global memory allocated by PoDoFo.
>>          * This is normally not necessary as memory
>>          * will be free'd when the application terminates.
>>          *
>>          * If you want to free all memory allocated by
>>          * PoDoFo you have to call this method.
>>          *
>>          * PoDoFo will reallocate the memory if necessary.
>>          */
>>         PdfEncodingFactory::FreeGlobalEncodingInstances();
>>     } catch( PdfError & eCode ) {
>>         /*
>>          * We have to check if an error has occurred.
>>          * If yes, we return and print an error message
>>          * to the commandline.
>>          */
>>         eCode.PrintErrorMsg();
>>         return eCode.GetError();
>>     }
>>
>>     /*
>>      * The PDF was created sucessfully.
>>      */
>>     std::cout << std::endl
>>               << "Created a PDF file containing the line \"Hello
>> World!\": " << argv[1] << std::endl << std::endl;
>>
>>     return 0;
>> }
>>
>> On 06.12.2019 17:25, Michal Sudolsky wrote:
>>
>> Hi,
>>
>> You did not send enough details. I can only guess what font name you used
>> and how you draw string but when I tested your text it shows in pdf without
>> spaces. Btw base14 fonts cannot be used with identity encoding.
>>
>> On Fri, Dec 6, 2019 at 1:29 PM Igor Mironchik <igor.mironc...@gmail.com>
>> wrote:
>>
>>> Hello.
>>>
>>> I try to create PDF file with PoDoFo library. I want to draw
>>> multi-language text in my PDF file.
>>>
>>> For this I create PdfFont with:
>>>
>>> PdfFont * createFont( const QString & name, bool bold, bool italic,
>>> float size,
>>>      PdfStreamedDocument * doc )
>>> {
>>>      auto * font = doc->CreateFont( name.toLocal8Bit().data(), bold,
>>> italic , false,
>>>          PdfEncodingFactory::GlobalIdentityEncodingInstance() );
>>>
>>>      if( !font )
>>>          PODOFO_RAISE_ERROR( ePdfError_InvalidHandle )
>>>
>>>      font->SetFontSize( size );
>>>
>>>      return font;
>>> }
>>>
>>> It works. I see English and Russian text in output PDF, but...
>>>
>>> Assume I have text: "The book Книга"
>>>
>>> It writes to PDF but in the output all characters are separated with
>>> space, like:
>>>
>>> "T h e  b o o k  К н и г а"
>>>
>>> How can I solve this issue?
>>>
>>> Thank you.
>>>
>>>
>>>
>>> _______________________________________________
>>> Podofo-users mailing list
>>> Podofo-users@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/podofo-users
>>>
>>
_______________________________________________
Podofo-users mailing list
Podofo-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/podofo-users

Reply via email to