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 <[email protected] <mailto:[email protected]>> wrote:

    Hi,

    Resend without attachment.

    Modified helloworld example has the same issue with spaces...

    /***************************************************************************
     *   Copyright (C) 2006 by Dominik
    Seichter                                *
     * [email protected] <mailto:[email protected]> *
     * *
     *   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
    <[email protected] <mailto:[email protected]>> 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
        [email protected]
        <mailto:[email protected]>
        https://lists.sourceforge.net/lists/listinfo/podofo-users

_______________________________________________
Podofo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/podofo-users

Reply via email to