📄 doc_pdf.cpp
字号:
while( (n = String.Find('\n')) >= 0 )
{
Strings.Add(String.Left(n));
String.Remove(0, n + 1);
}
if( Strings.Get_Count() > 0 )
{
if( String.Length() > 0 )
{
Strings.Add(String);
}
return( Draw_Text(x, y, Strings, Size, Style, Angle, Color, Font) );
}
return( _Draw_Text(x, y, Text, Size, Style, Angle, Color, Font) );
}
//---------------------------------------------------------
bool CSG_Doc_PDF::_Draw_Text(double x, double y, const SG_Char *Text, int Size, int Style, double Angle, int Color, TSG_PDF_Font_Type Font)
{
float Width, Height;
if( m_pCanvas && Text && *Text != '\0' )
{
double ax, ay, bx, by;
m_pCanvas->SetFontAndSize(_Get_Font_Name(Font), Size);
m_pCanvas->SetTextRenderingMode(PDF_FILL_THEN_STROKE);
m_pCanvas->SetLineWidth(0);
m_pCanvas->SetRGBStroke(SG_GET_R(Color), SG_GET_G(Color), SG_GET_B(Color));
m_pCanvas->SetRGBFill (SG_GET_R(Color), SG_GET_G(Color), SG_GET_B(Color));
Width = m_pCanvas->TextWidth(SG_STR_SGTOMB(Text)) * cos(Angle);
Height = m_pCanvas->TextWidth(SG_STR_SGTOMB(Text)) * sin(Angle) + Size;
//-------------------------------------------------
if( Style & PDF_STYLE_TEXT_ALIGN_H_CENTER )
{
ax = x - m_pCanvas->TextWidth(SG_STR_SGTOMB(Text)) / 2.0;
}
else if( Style & PDF_STYLE_TEXT_ALIGN_H_RIGHT )
{
ax = x - m_pCanvas->TextWidth(SG_STR_SGTOMB(Text));
}
else
{
ax = x;
}
bx = ax + m_pCanvas->TextWidth(SG_STR_SGTOMB(Text));
if( Style & PDF_STYLE_TEXT_ALIGN_V_CENTER )
{
ay = y - Size / 2.0;
}
else if( Style & PDF_STYLE_TEXT_ALIGN_V_TOP )
{
ay = y - Size;
}
else
{
ay = y;
}
by = ay;
//-------------------------------------------------
m_pCanvas->BeginText();
if( Angle != 0.0 )
{
double dSin, dCos, dx, dy;
dSin = sin(-Angle);
dCos = cos(-Angle),
dx = ax - x,
dy = ay - y;
ax = x + dCos * dx + dSin * dy;
ay = y - dSin * dx + dCos * dy;
dx = bx - x,
dy = by - y;
bx = x + dCos * dx + dSin * dy;
by = y - dSin * dx + dCos * dy;
dSin = sin(Angle);
dCos = cos(Angle),
m_pCanvas->SetTextMatrix(dCos, dSin, -dSin, dCos, ax, ay);
}
else
{
m_pCanvas->MoveTextPos(ax, ay);
}
m_pCanvas->ShowText(SG_STR_SGTOMB(Text));
m_pCanvas->EndText();
//-------------------------------------------------
if( Style & PDF_STYLE_TEXT_UNDERLINE )
{
double dx, dy;
dy = 0.2 * Size * (ax - bx) / SG_Get_Distance(ax, ay, bx, by);
dx = -0.2 * Size * (ay - by) / SG_Get_Distance(ax, ay, bx, by);
Draw_Line(ax + dx, ay + dy, bx + dx, by + dy, (int)(0.1 * Size), Color);
}
if( Style & PDF_STYLE_TEXT_STROKE )
{
double dx, dy;
dy = -0.4 * Size * (ax - bx) / SG_Get_Distance(ax, ay, bx, by);
dx = 0.4 * Size * (ay - by) / SG_Get_Distance(ax, ay, bx, by);
Draw_Line(ax + dx, ay + dy, bx + dx, by + dy, (int)(0.1 * Size), Color);
}
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CSG_Doc_PDF::Draw_Image(double x, double y, double dx, double dy, const SG_Char *FileName)
{
bool bKeepRatio = true;
PdfImage *pImage = NULL;
//-----------------------------------------------------
if( m_pCanvas && SG_File_Exists(FileName) && dx > 0.0 && dy > 0.0 )
{
if( SG_File_Cmp_Extension(FileName, SG_T("png")) )
{
PdfPngImage *pPNG;
pPNG = new PdfPngImage(m_pPDF);
// pPNG ->LoadFromFile(SG_STR_SGTOMB(FileName));
try { pPNG ->LoadFromFile(SG_STR_SGTOMB(FileName)); } catch(...) {}
if( !pPNG->IsValidObject() )
{
delete(pPNG);
}
else
{
pImage = pPNG;
}
}
else if( SG_File_Cmp_Extension(FileName, SG_T("jpg")) )
{
PdfJpegImage *pJPG;
pJPG = new PdfJpegImage(m_pPDF);
// pJPG ->LoadFromFile(SG_STR_SGTOMB(FileName));
try { pJPG ->LoadFromFile(SG_STR_SGTOMB(FileName)); } catch(...) {}
if( !pJPG->IsValidObject() )
{
delete(pJPG);
}
else
{
pImage = pJPG;
}
}
}
//-----------------------------------------------------
if( pImage )
{
if( bKeepRatio )
{
_Fit_Rectangle(x, y, dx, dy, pImage->Width() / pImage->Height(), true);
}
pImage->AddFilter(PDF_FILTER_DEFLATE);
m_pPDF->AddXObject(pImage);
m_pCanvas->GSave();
m_pCanvas->Concat(dx, 0, 0, dy, x, y);
m_pCanvas->ExecuteXObject(pImage);
m_pCanvas->GRestore();
return( true );
}
return( false );
}
//---------------------------------------------------------
bool CSG_Doc_PDF::Draw_Image(const CSG_Rect &r, const SG_Char *FileName)
{
return( Draw_Image(r.Get_XMin(), r.Get_YMin(), r.Get_XRange(), r.Get_YRange(), FileName) );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CSG_Doc_PDF::Draw_Graticule(const CSG_Rect &r, const CSG_Rect &rWorld, int Size)
{
if( Is_Ready_To_Draw() )
{
CSG_Rect rRuler, rFrame(r);
rFrame.Inflate(Size, false);
Draw_Rectangle(rFrame, PDF_STYLE_POLYGON_STROKE);
Draw_Rectangle(r , PDF_STYLE_POLYGON_STROKE);
rRuler.Assign(r.Get_XMin(), r.Get_YMax(), r.Get_XMax(), rFrame.Get_YMax());
_Draw_Ruler(rRuler, rWorld.Get_XMin(), rWorld.Get_XMax() , true , true , false);
rRuler.Assign(r.Get_XMin(), r.Get_YMin(), r.Get_XMax(), rFrame.Get_YMin());
_Draw_Ruler(rRuler, 0.0 , rWorld.Get_XRange(), true , true , true);
rRuler.Assign(r.Get_XMin(), r.Get_YMin(), rFrame.Get_XMin(), r.Get_YMax());
_Draw_Ruler(rRuler, rWorld.Get_YMin(), rWorld.Get_YMax() , false, false, false);
rRuler.Assign(r.Get_XMax(), r.Get_YMin(), rFrame.Get_XMax(), r.Get_YMax());
_Draw_Ruler(rRuler, 0.0 , rWorld.Get_YRange(), false, false, true);
return( true );
}
return( false );
}
//---------------------------------------------------------
#define RULER_TEXT_SPACE 4
//---------------------------------------------------------
bool CSG_Doc_PDF::_Draw_Ruler(const CSG_Rect &r, double zMin, double zMax, bool bHorizontal, bool bAscendent, bool bTickAtTop)
{
int Decimals, FontSize;
double xOff, yOff, Width, Height, Height_Tick, z, dz, zToDC, zDC, zPos, tPos;
CSG_String s;
//-----------------------------------------------------
Width = bHorizontal ? r.Get_XRange() : r.Get_YRange();
Height = bHorizontal ? r.Get_YRange() : r.Get_XRange();
if( Is_Ready_To_Draw() && zMin < zMax && Width > 0 && Height > 0 )
{
xOff = r.Get_XMin();
yOff = r.Get_YMax();
FontSize = (int)(0.45 * (double)Height);
m_pCanvas->SetFontAndSize(_Get_Font_Name(PDF_FONT_DEFAULT), FontSize);
Height_Tick = (int)(0.3 * (double)Height);
//-------------------------------------------------
zToDC = (double)Width / (zMax - zMin);
dz = pow(10.0, floor(log10(zMax - zMin)) - 1.0);
Decimals = dz >= 1.0 ? 0 : (int)fabs(log10(dz));
s.Printf(SG_T("%.*f"), Decimals, zMax);
zDC = m_pCanvas->TextWidth(SG_STR_SGTOMB(s));
while( zToDC * dz < zDC + RULER_TEXT_SPACE )
{
dz *= 2;
}
//-------------------------------------------------
z = dz * floor(zMin / dz);
if( z < zMin ) z += dz;
for(; z<=zMax; z+=dz)
{
s.Printf(SG_T("%.*f"), Decimals, z);
zDC = bAscendent ? zToDC * (z - zMin) : Width - zToDC * (z - zMin);
if( bHorizontal )
{
zPos = xOff + zDC;
if( bTickAtTop )
{
tPos = yOff;
Draw_Line(zPos, tPos - Height_Tick, zPos, yOff);
Draw_Text(zPos, tPos - Height_Tick, s, FontSize, PDF_STYLE_TEXT_ALIGN_H_CENTER|PDF_STYLE_TEXT_ALIGN_V_TOP, 0.0);
}
else
{
tPos = yOff - Height;
Draw_Line(zPos, tPos + Height_Tick, zPos, tPos);
Draw_Text(zPos, tPos + Height_Tick, s, FontSize, PDF_STYLE_TEXT_ALIGN_H_CENTER|PDF_STYLE_TEXT_ALIGN_V_BOTTOM, 0.0);
}
}
else
{
zPos = yOff - zDC;
if( bTickAtTop )
{
tPos = xOff;
Draw_Line(tPos + Height_Tick, zPos, tPos, zPos);
Draw_Text(tPos + Height_Tick, zPos, s, FontSize, PDF_STYLE_TEXT_ALIGN_H_CENTER|PDF_STYLE_TEXT_ALIGN_V_TOP, M_DEG_TO_RAD * 90.0);
}
else
{
tPos = xOff + Height;
Draw_Line(tPos - Height_Tick, zPos, tPos, zPos);
Draw_Text(tPos - Height_Tick, zPos, s, FontSize, PDF_STYLE_TEXT_ALIGN_H_CENTER|PDF_STYLE_TEXT_ALIGN_V_BOTTOM, M_DEG_TO_RAD * 90.0);
}
}
}
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CSG_Doc_PDF::_Draw_Table(CSG_Rect r, CSG_Table *pTable, int iRecord, int nRecords, double CellHeight, double HeaderHeightRel)
{
int iField, dyFont, dyFont_Hdr;
double xPos, yPos, dxPos, dyPos, dyPos_Hdr, xSpace, ySpace, ySpace_Hdr;
bool bAddHeader;
CSG_Table_Record *pRecord;
if( pTable && pTable->is_Valid() && iRecord < pTable->Get_Record_Count() )
{
// Draw_Text(r.Get_XMin(), r.Get_YMax(), pTable->Get_Name(), 16); // the table's name should not be drawn here...
dxPos = r.Get_XRange() / pTable->Get_Field_Count();
if( HeaderHeightRel < 1.0 )
HeaderHeightRel = 1.0;
dyPos = CellHeight > 0.0 ? CellHeight : r.Get_YRange() / (nRecords + HeaderHeightRel);
dyPos_Hdr = dyPos * HeaderHeightRel;
dyFont = (int)(0.75 * dyPos);
dyFont_Hdr = (int)(0.75 * dyPos_Hdr);
ySpace = 0.1 * dyPos;
ySpace_Hdr = 0.1 * dyPos_Hdr;
xSpace = ySpace;
nRecords += iRecord;
if( nRecords > pTable->Get_Record_Count() )
{
nRecords = pTable->Get_Record_Count();
}
//-------------------------------------------------
for(yPos=r.Get_YMax(), bAddHeader=true; iRecord<nRecords; iRecord++, yPos-=dyPos)
{
if( yPos < r.Get_YMin() - dyPos )
{
Add_Page();
yPos = r.Get_YMax();
bAddHeader = true;
}
if( bAddHeader )
{
for(iField=0, xPos=r.Get_XMin(); iField<pTable->Get_Field_Count(); iField++, xPos+=dxPos)
{
Draw_Rectangle(xPos, yPos, xPos + dxPos, yPos - dyPos_Hdr, PDF_STYLE_POLYGON_FILLSTROKE, SG_COLOR_GREY_LIGHT, SG_COLOR_BLACK, 0);
Draw_Text(xPos + xSpace, yPos - ySpace_Hdr, pTable->Get_Field_Name(iField), dyFont_Hdr, PDF_STYLE_TEXT_ALIGN_H_LEFT|PDF_STYLE_TEXT_ALIGN_V_TOP);
}
yPos -= dyPos_Hdr;
bAddHeader = false;
}
//---------------------------------------------
pRecord = pTable->Get_Record(iRecord);
for(iField=0, xPos=r.Get_XMin(); iField<pTable->Get_Field_Count(); iField++, xPos+=dxPos)
{
Draw_Rectangle(xPos, yPos, xPos + dxPos, yPos - dyPos, PDF_STYLE_POLYGON_STROKE, SG_COLOR_WHITE, SG_COLOR_BLACK, 0);
Draw_Text(xPos + xSpace, yPos - ySpace, pRecord->asString(iField), dyFont, PDF_STYLE_TEXT_ALIGN_H_LEFT|PDF_STYLE_TEXT_ALIGN_V_TOP);
}
}
return( true );
}
return( false );
}
//---------------------------------------------------------
bool CSG_Doc_PDF::Draw_Table(const CSG_Rect &r, CSG_Table *pTable, double CellHeight, double HeaderHeightRel)
{
if( pTable && pTable->is_Valid() )
{
return( _Draw_Table(r, pTable, 0, pTable->Get_Record_Count(), CellHeight, HeaderHeightRel) );
}
return( false );
}
//---------------------------------------------------------
bool CSG_Doc_PDF::Draw_Table(const CSG_Rect &r, CSG_Table *pTable, int nColumns, double CellHeight, double HeaderHeightRel)
{
if( pTable && pTable->is_Valid() && nColumns > 1 )
{
int nRecords;
double dx, dxSpace;
CSG_Rect rColumn(r), rTable(r);
dxSpace = 4;
rTable.Inflate(dxSpace, 0.0, false);
dx = rTable.Get_XRange() / (double)nColumns;
nRecords = pTable->Get_Record_Count() / nColumns;
for(int i=0, iRecord=0; i<nColumns; i++, iRecord+=nRecords)
{
rColumn.m_rect.xMin = rTable.Get_XMin() + (i + 0) * dx + dxSpace;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -