On 06.12.2019 18:29, Michal Sudolsky wrote:
Hi,

As you can see there are much more problems with 0.9.6. You are better with latest podofo from trunk.

Yes PdfFontCache::eFontCreationFlags_None was meant to resolve something different. You should always use it with identity encoding. Ideally podofo should not try to pick up base14 fonts when is specified identity encoding.


Thank you guys for your great work!



On Fri, Dec 6, 2019 at 4:23 PM Igor Mironchik <igor.mironc...@gmail.com <mailto:igor.mironc...@gmail.com>> wrote:

    Hi,

    On 06.12.2019 17:55, Michal Sudolsky wrote:
    Hi,

    Can you try with latest podofo?
    https://sourceforge.net/p/podofo/code/HEAD/tree/


    In the trunk rev 1999 this issue does not exist. Looks like the
    bug in PoDoFo 0.9.6.

    And PdfFontCache::eFontCreationFlags_None does not matter.

    Can I use PoDoFo from trunk for my application? Or there can be
    problems?


    On Fri, Dec 6, 2019 at 3:52 PM Igor Mironchik
    <igor.mironc...@gmail.com <mailto: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 <mailto: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 <mailto: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
            <mailto: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