Make texts search-able in PDF files (using invisible texts behind stroked texts)
This commit is contained in:
parent
9447181a08
commit
0999b5cb77
|
@ -775,66 +775,67 @@ void PDF_PLOTTER::Text( const wxPoint& aPos,
|
||||||
aMultilineAllowed = false; // the text has only one line.
|
aMultilineAllowed = false; // the text has only one line.
|
||||||
|
|
||||||
// Emit native PDF text (if requested)
|
// Emit native PDF text (if requested)
|
||||||
// Currently: does not work: disable it
|
// Currently: is not supported, because only our stroke font is alloxed: disable it
|
||||||
bool use_native = false; // = m_textMode != PLOTTEXTMODE_STROKE && !aMultilineAllowed;
|
// However, shadowed texts (searchable texts) works reasonably well because
|
||||||
|
// pixel accurate precision is not requested, so we add searchable texts
|
||||||
|
// behind our stroked font texts
|
||||||
|
bool use_native_font = false;
|
||||||
|
// render_mode 0 shows the text, render_mode 3 is invisible
|
||||||
|
int render_mode = use_native_font ? 0 : 3;
|
||||||
|
|
||||||
if( use_native )
|
const char *fontname = aItalic ? (aBold ? "/KicadFontBI" : "/KicadFontI")
|
||||||
|
: (aBold ? "/KicadFontB" : "/KicadFont");
|
||||||
|
|
||||||
|
// Compute the copious tranformation parameters of the Curent Transform Matrix
|
||||||
|
double ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f;
|
||||||
|
double wideningFactor, heightFactor;
|
||||||
|
|
||||||
|
computeTextParameters( aPos, aText, aOrient, aSize, m_plotMirror, aH_justify,
|
||||||
|
aV_justify, aWidth, aItalic, aBold,
|
||||||
|
&wideningFactor, &ctm_a, &ctm_b, &ctm_c,
|
||||||
|
&ctm_d, &ctm_e, &ctm_f, &heightFactor );
|
||||||
|
|
||||||
|
SetColor( aColor );
|
||||||
|
SetCurrentLineWidth( aWidth, aData );
|
||||||
|
|
||||||
|
/* We use the full CTM instead of the text matrix because the same
|
||||||
|
coordinate system will be used for the overlining. Also the %f
|
||||||
|
for the trig part of the matrix to avoid %g going in exponential
|
||||||
|
format (which is not supported)
|
||||||
|
render_mode 0 shows the text, render_mode 3 is invisible */
|
||||||
|
fprintf( workFile, "q %f %f %f %f %g %g cm BT %s %g Tf %d Tr %g Tz ",
|
||||||
|
ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f,
|
||||||
|
fontname, heightFactor, render_mode,
|
||||||
|
wideningFactor * 100 );
|
||||||
|
|
||||||
|
// The text must be escaped correctly
|
||||||
|
fputsPostscriptString( workFile, aText );
|
||||||
|
fputs( " Tj ET\n", workFile );
|
||||||
|
|
||||||
|
// We are in text coordinates, plot the overbars, if we're not doing phantom text
|
||||||
|
if( use_native_font )
|
||||||
{
|
{
|
||||||
const char *fontname = aItalic ? (aBold ? "/KicadFontBI" : "/KicadFontI")
|
std::vector<int> pos_pairs;
|
||||||
: (aBold ? "/KicadFontB" : "/KicadFont");
|
postscriptOverlinePositions( aText, aSize.x, aItalic, aBold, &pos_pairs );
|
||||||
|
int overbar_y = KiROUND( aSize.y * 1.1 );
|
||||||
// Compute the copious tranformation parameters
|
for( unsigned i = 0; i < pos_pairs.size(); i += 2)
|
||||||
double ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f;
|
|
||||||
double wideningFactor, heightFactor;
|
|
||||||
computeTextParameters( aPos, aText, aOrient, aSize, aH_justify,
|
|
||||||
aV_justify, aWidth, aItalic, aBold,
|
|
||||||
&wideningFactor, &ctm_a, &ctm_b, &ctm_c,
|
|
||||||
&ctm_d, &ctm_e, &ctm_f, &heightFactor );
|
|
||||||
|
|
||||||
SetColor( aColor );
|
|
||||||
SetCurrentLineWidth( aWidth, aData );
|
|
||||||
|
|
||||||
/* We use the full CTM instead of the text matrix because the same
|
|
||||||
coordinate system will be used for the overlining. Also the %f
|
|
||||||
for the trig part of the matrix to avoid %g going in exponential
|
|
||||||
format (which is not supported)
|
|
||||||
Rendermode 0 shows the text, rendermode 3 is invisible */
|
|
||||||
fprintf( workFile, "q %f %f %f %f %g %g cm BT %s %g Tf %d Tr %g Tz ",
|
|
||||||
ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f,
|
|
||||||
fontname, heightFactor,
|
|
||||||
(m_textMode == PLOTTEXTMODE_NATIVE) ? 0 : 3,
|
|
||||||
wideningFactor * 100 );
|
|
||||||
|
|
||||||
// The text must be escaped correctly
|
|
||||||
fputsPostscriptString( workFile, aText );
|
|
||||||
fputs( " Tj ET\n", workFile );
|
|
||||||
|
|
||||||
/* We are still in text coordinates, plot the overbars (if we're
|
|
||||||
* not doing phantom text) */
|
|
||||||
if( m_textMode == PLOTTEXTMODE_NATIVE )
|
|
||||||
{
|
{
|
||||||
std::vector<int> pos_pairs;
|
/* This is a nontrivial situation: we are *not* in the user
|
||||||
postscriptOverlinePositions( aText, aSize.x, aItalic, aBold, &pos_pairs );
|
coordinate system, so the userToDeviceCoordinates function
|
||||||
int overbar_y = KiROUND( aSize.y * 1.1 );
|
can't be used! Strange as it may seem, the userToDeviceSize
|
||||||
for( unsigned i = 0; i < pos_pairs.size(); i += 2)
|
is the right function to use here... */
|
||||||
{
|
DPOINT dev_from = userToDeviceSize( wxSize( pos_pairs[i], overbar_y ) );
|
||||||
/* This is a nontrivial situation: we are *not* in the user
|
DPOINT dev_to = userToDeviceSize( wxSize( pos_pairs[i + 1], overbar_y ) );
|
||||||
coordinate system, so the userToDeviceCoordinates function
|
fprintf( workFile, "%g %g m %g %g l ",
|
||||||
can't be used! Strange as it may seem, the userToDeviceSize
|
dev_from.x, dev_from.y, dev_to.x, dev_to.y );
|
||||||
is the right function to use here... */
|
|
||||||
DPOINT dev_from = userToDeviceSize( wxSize( pos_pairs[i], overbar_y ) );
|
|
||||||
DPOINT dev_to = userToDeviceSize( wxSize( pos_pairs[i + 1], overbar_y ) );
|
|
||||||
fprintf( workFile, "%g %g m %g %g l ",
|
|
||||||
dev_from.x, dev_from.y, dev_to.x, dev_to.y );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stroke and restore the CTM
|
|
||||||
fputs( "S Q\n", workFile );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Stroke and restore the CTM
|
||||||
|
fputs( "S Q\n", workFile );
|
||||||
|
|
||||||
// Plot the stroked text (if requested)
|
// Plot the stroked text (if requested)
|
||||||
if( !use_native )
|
if( !use_native_font )
|
||||||
{
|
{
|
||||||
PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify,
|
PLOTTER::Text( aPos, aColor, aText, aOrient, aSize, aH_justify, aV_justify,
|
||||||
aWidth, aItalic, aBold, aMultilineAllowed );
|
aWidth, aItalic, aBold, aMultilineAllowed );
|
||||||
|
|
|
@ -427,6 +427,7 @@ void PSLIKE_PLOTTER::computeTextParameters( const wxPoint& aPos,
|
||||||
const wxString& aText,
|
const wxString& aText,
|
||||||
int aOrient,
|
int aOrient,
|
||||||
const wxSize& aSize,
|
const wxSize& aSize,
|
||||||
|
bool aMirror,
|
||||||
enum EDA_TEXT_HJUSTIFY_T aH_justify,
|
enum EDA_TEXT_HJUSTIFY_T aH_justify,
|
||||||
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
||||||
int aWidth,
|
int aWidth,
|
||||||
|
@ -487,7 +488,14 @@ void PSLIKE_PLOTTER::computeTextParameters( const wxPoint& aPos,
|
||||||
DPOINT sz_dev = userToDeviceSize( aSize );
|
DPOINT sz_dev = userToDeviceSize( aSize );
|
||||||
|
|
||||||
// Now returns the final values... the widening factor
|
// Now returns the final values... the widening factor
|
||||||
*wideningFactor = sz_dev.y / sz_dev.x;
|
*wideningFactor = sz_dev.x / sz_dev.y;
|
||||||
|
|
||||||
|
// Mirrored texts must be plotted as mirrored!
|
||||||
|
if( m_plotMirror )
|
||||||
|
{
|
||||||
|
*wideningFactor = -*wideningFactor;
|
||||||
|
aOrient = -aOrient;
|
||||||
|
}
|
||||||
|
|
||||||
// The CTM transformation matrix
|
// The CTM transformation matrix
|
||||||
double alpha = DECIDEG2RAD( aOrient );
|
double alpha = DECIDEG2RAD( aOrient );
|
||||||
|
@ -953,7 +961,7 @@ void PS_PLOTTER::Text( const wxPoint& aPos,
|
||||||
// Compute the copious tranformation parameters
|
// Compute the copious tranformation parameters
|
||||||
double ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f;
|
double ctm_a, ctm_b, ctm_c, ctm_d, ctm_e, ctm_f;
|
||||||
double wideningFactor, heightFactor;
|
double wideningFactor, heightFactor;
|
||||||
computeTextParameters( aPos, aText, aOrient, aSize, aH_justify,
|
computeTextParameters( aPos, aText, aOrient, aSize, m_plotMirror, aH_justify,
|
||||||
aV_justify, aWidth, aItalic, aBold,
|
aV_justify, aWidth, aItalic, aBold,
|
||||||
&wideningFactor, &ctm_a, &ctm_b, &ctm_c,
|
&wideningFactor, &ctm_a, &ctm_b, &ctm_c,
|
||||||
&ctm_d, &ctm_e, &ctm_f, &heightFactor );
|
&ctm_d, &ctm_e, &ctm_f, &heightFactor );
|
||||||
|
|
|
@ -692,6 +692,7 @@ protected:
|
||||||
const wxString& aText,
|
const wxString& aText,
|
||||||
int aOrient,
|
int aOrient,
|
||||||
const wxSize& aSize,
|
const wxSize& aSize,
|
||||||
|
bool aMirror,
|
||||||
enum EDA_TEXT_HJUSTIFY_T aH_justify,
|
enum EDA_TEXT_HJUSTIFY_T aH_justify,
|
||||||
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
enum EDA_TEXT_VJUSTIFY_T aV_justify,
|
||||||
int aWidth,
|
int aWidth,
|
||||||
|
|
Loading…
Reference in New Issue