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