I am just user of podofo and had similar problems as you.
On Fri, Dec 6, 2019 at 4:35 PM Igor Mironchik <igor.mironc...@gmail.com> wrote: > > 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> > 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> >> 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