Issue with PdfString created from const char* and unicode fonts.
In PdfPainter, DrawText and many other methods do accept a PdfString as
input parameter. Do not be lazy, and call such methods with just a const
char pointer, and expect that everything works behind the scene, if you are
using unicode based fonts.
Allways use a correct/explict PdfString constructor. Do not believe the
magic of the automatic conversions.
>From helloworld-base14.cpp:
// draw sample of all types
for(i = 0; i < NUM_BASE14_FONTS; ++i)
{
x = 56; y = y - 25;
strcpy((char*)text, (const char*)demo_text);
strcat((char*)text, GetBase14FontName(i));
PdfFont *pFont;
if (i < NUM_BASE14_FONTS - 3) {
pFont = document.CreateFont( GetBase14FontName(i) );
}
else {
pFont = document.CreateFontSubset(GetBase14FontName(i),
false, false, false, new PdfIdentityEncoding(0, 0xffff,
true));
}
pFont->SetFontSize( 12.0 );
painter.SetFont( pFont );
/* FIXED: Use desired PdfString constructor */
PdfString pdfText(reinterpret_cast<const pdf_utf8*>(text));
width = pFont->GetFontMetrics()->StringWidth(pdfText);
height = pFont->GetFontMetrics()->GetLineSpacing();
std::cout << GetBase14FontName(i) << " Width = " << width << "
Height = " << height << std::endl;
// draw red box
DrawRedFrame( painter, x, y, width, height);
// draw text
painter.DrawText( x, y , pdfText);
}
Lession learned, if you do font subsetting, then be carefull how you
prepare input, or you can get unexpected results.
With font subsetting for Arial, Times New Roman, and Verdana fonts, you can
reduce the size of helloworld-base14 output to 54 kB.
Wrong way:
pdfPainter.DrawText(x, y, "wrong way of drawing, as pdf string is not
marked as IsUnicode()");
Better ways:
pdfPainter.DrawText(x, y, PdfString("this actually will
work").ToUnicode());
pdfPainter.DrawText(x, y, reinterpret_cast<const pdf_utf8*>("uggly
but it works"));
Preferred:
pdfPainter.DrawText(x, y, PdfString(L"this is already wchar_t"));
const pdf_utf8 utf8Text = "a some utf8 encoded text");
pdfPainter.DrawText(x, y, utf8Text);
------------------------------------------------------------------------------
_______________________________________________
Podofo-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/podofo-users