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