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