📄 doc_pdf.cpp
字号:
///////////////////////////////////////////////////////////
// //
// SAGA //
// //
// System for Automated Geoscientific Analyses //
// //
// Application Programming Interface //
// //
// Library: SAGA_API //
// //
//-------------------------------------------------------//
// //
// doc_pdf.cpp //
// //
// Copyright (C) 2005 by //
// Victor Olaya, Olaf Conrad //
// //
//-------------------------------------------------------//
// //
// This file is part of 'SAGA - System for Automated //
// Geoscientific Analyses'. //
// //
// This library is free software; you can redistribute //
// it and/or modify it under the terms of the GNU Lesser //
// General Public License as published by the Free //
// Software Foundation, version 2.1 of the License. //
// //
// This library 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 Lesser General Public //
// License for more details. //
// //
// You should have received a copy of the GNU Lesser //
// 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. //
// //
//-------------------------------------------------------//
// //
// contact: Olaf Conrad //
// Institute of Geography //
// University of Goettingen //
// Goldschmidtstr. 5 //
// 37077 Goettingen //
// Germany //
// //
// e-mail: oconrad@saga-gis.org //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#ifndef _SAGA_DONOTUSE_HARU
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#if defined(_SAGA_MSW)
#define XMD_H
#if !defined(_SAGA_MINGW)
#define HAVE_BOOLEAN
#define boolean bool
#endif
#endif
#include <libharu.h>
//---------------------------------------------------------
#include "doc_pdf.h"
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
#define PDF_PAGE_HEIGHT_A4_M 0.297
#define PDF_PAGE_WIDTH_A3 PDF_PAGE_HEIGHT_A4
#define PDF_PAGE_HEIGHT_A3 (PDF_PAGE_HEIGHT_A4 * sqrt(2.0))
#define PDF_METER_TO_POINT (PDF_PAGE_HEIGHT_A4 / PDF_PAGE_HEIGHT_A4_M)
#define PDF_POINT_TO_METER (PDF_PAGE_HEIGHT_A4_M / PDF_PAGE_HEIGHT_A4)
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
CSG_Doc_PDF::CSG_Doc_PDF(void)
{
m_pPDF = NULL;
Layout_Set_Box_Space(5, false);
Open();
}
//---------------------------------------------------------
CSG_Doc_PDF::CSG_Doc_PDF(TSG_PDF_Page_Size Size, int Orientation, const SG_Char *Title)
{
m_pPDF = NULL;
Layout_Set_Box_Space(5, false);
Open(Size, Orientation, Title);
}
//---------------------------------------------------------
CSG_Doc_PDF::~CSG_Doc_PDF(void)
{
Close();
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CSG_Doc_PDF::Open(const SG_Char *Title)
{
return( Open(PDF_PAGE_SIZE_A4, PDF_PAGE_ORIENTATION_PORTRAIT, Title) );
}
//---------------------------------------------------------
bool CSG_Doc_PDF::Open(TSG_PDF_Page_Size Size, int Orientation, const SG_Char *Title)
{
if( Close() )
{
m_pPDF = new PdfDoc();
m_pPDF ->NewDoc();
m_pLastLevel0OutlineItem = NULL;
m_pLastLevel1OutlineItem = NULL;
m_pLastLevel2OutlineItem = NULL;
Set_Size_Page(Size, Orientation);
PdfType1FontDef *pFontDef = new PdfHelveticaFontDef();
m_pPDF ->AddType1Font(pFontDef, "WinAnsiEncoding", new PdfWinAnsiEncoding());
m_Font_Default = pFontDef->FontName();
if( Title && *Title )
{
Add_Page_Title(Title);
}
return( true );
}
return( false );
}
//---------------------------------------------------------
bool CSG_Doc_PDF::Close(void)
{
if( m_pPDF )
{
try
{
m_pPDF->FreeDoc();
delete(m_pPDF);
}
catch(...)
{
return( false );
}
}
m_pPDF = NULL;
m_pPage = NULL;
m_pCanvas = NULL;
m_nPages = 0;
return( true );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CSG_Doc_PDF::Save(const SG_Char *FileName)
{
if( m_pPDF && m_nPages > 0 && SG_Dir_Create(SG_File_Get_Path(FileName)) )
{
try
{
m_pPDF->WriteToFile(SG_STR_SGTOMB(FileName));
}
catch(...)
{
return ( false );
}
return( true );
}
SG_UI_Msg_Add_Error(LNG("[ERR] Could not save PDF file."));
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
double CSG_Doc_PDF::Get_Page_To_Meter(void)
{
return( PDF_POINT_TO_METER );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
const char * CSG_Doc_PDF::_Get_Font_Name(TSG_PDF_Font_Type Font)
{
return( "WinAnsiEncoding" );
switch( Font )
{
case PDF_FONT_Helvetica: return( "Helvetica" );
case PDF_FONT_Helvetica_Bold: return( "Helvetica-Bold" );
case PDF_FONT_Helvetica_Oblique: return( "Helvetica-Oblique" );
case PDF_FONT_Helvetica_BoldOblique: return( "Helvetica-BoldOblique" );
case PDF_FONT_Times_Roman: return( "Times-Roman" );
case PDF_FONT_Times_Bold: return( "Times-Bold" );
case PDF_FONT_Times_Italic: return( "Times-Italic" );
case PDF_FONT_Times_BoldItalic: return( "Times-BoldItalic" );
case PDF_FONT_Courier: return( "Courier" );
case PDF_FONT_Courier_Bold: return( "Courier-Bold" );
case PDF_FONT_Courier_Oblique: return( "Courier-Oblique" );
case PDF_FONT_Courier_BoldOblique: return( "Courier-BoldOblique" );
case PDF_FONT_Symbol: return( "Symbol" );
case PDF_FONT_ZapfDingbats: return( "ZapfDingbats" );
}
return( m_Font_Default );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CSG_Doc_PDF::Layout_Add_Box(double xMin_Percent, double yMin_Percent, double xMax_Percent, double yMax_Percent, const SG_Char *ID)
{
if( m_Boxes_Percent.Add(xMin_Percent, yMin_Percent, xMax_Percent, yMax_Percent) )
{
m_Boxes.Add();
m_Boxes_ID.Add(ID);
_Layout_Set_Box(m_Boxes.Get_Count() - 1);
return( true );
}
return( false );
}
//---------------------------------------------------------
bool CSG_Doc_PDF::Layout_Add_Box(const CSG_Rect &Box_Percent, const SG_Char *ID)
{
return( Layout_Add_Box(Box_Percent.Get_XMin(), Box_Percent.Get_YMin(), Box_Percent.Get_XMax(), Box_Percent.Get_YMax(), ID) );
}
//---------------------------------------------------------
const CSG_Rect & CSG_Doc_PDF::Layout_Get_Box(const SG_Char *ID)
{
for(int i=0; i<m_Boxes_ID.Get_Count(); i++)
{
if( !m_Boxes_ID[i].Cmp(ID) )
{
return( Layout_Get_Box(i) );
}
}
return( Layout_Get_Box(-1) );
}
//---------------------------------------------------------
void CSG_Doc_PDF::Layout_Set_Box_Space(double Space, bool bPercent)
{
m_Boxes_Space_bPercent = bPercent;
m_Boxes_Space = Space;
}
//---------------------------------------------------------
void CSG_Doc_PDF::_Layout_Set_Boxes(void)
{
for(int i=0; i<m_Boxes.Get_Count(); i++)
{
_Layout_Set_Box(i);
}
}
//---------------------------------------------------------
void CSG_Doc_PDF::_Layout_Set_Box(int iBox)
{
if( iBox >= 0 && iBox < m_Boxes.Get_Count() && iBox < m_Boxes_Percent.Get_Count() )
{
m_Boxes[iBox].Assign(
m_Size_Margins.Get_XMin() + 0.01 * m_Boxes_Percent[iBox].Get_XMin() * m_Size_Margins.Get_XRange(),
m_Size_Margins.Get_YMax() - 0.01 * m_Boxes_Percent[iBox].Get_YMax() * m_Size_Margins.Get_YRange(),
m_Size_Margins.Get_XMin() + 0.01 * m_Boxes_Percent[iBox].Get_XMax() * m_Size_Margins.Get_XRange(),
m_Size_Margins.Get_YMax() - 0.01 * m_Boxes_Percent[iBox].Get_YMin() * m_Size_Margins.Get_YRange()
);
m_Boxes[iBox].Deflate(m_Boxes_Space, m_Boxes_Space_bPercent);
}
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CSG_Doc_PDF::_Fit_Rectangle(double &x, double &y, double &dx, double &dy, double XToY_Ratio, bool bShrink)
{
if( XToY_Ratio != 0.0 && dx != 0.0 && dy != 0.0 )
{
if( XToY_Ratio > dx / dy )
{
if( bShrink )
{
XToY_Ratio = dx / XToY_Ratio;
y += (dy - XToY_Ratio) / 2.0;
dy = XToY_Ratio;
}
else
{
XToY_Ratio = dy * XToY_Ratio;
x -= (dx - XToY_Ratio) / 2.0;
dx = XToY_Ratio;
}
}
else
{
if( bShrink )
{
XToY_Ratio = dy * XToY_Ratio;
x += (dx - XToY_Ratio) / 2.0;
dx = XToY_Ratio;
}
else
{
XToY_Ratio = dx / XToY_Ratio;
y -= (dy - XToY_Ratio) / 2.0;
dy = XToY_Ratio;
}
}
return( true );
}
return( false );
}
//---------------------------------------------------------
bool CSG_Doc_PDF::_Fit_Rectangle(CSG_Rect &r, double XToY_Ratio, bool bShrink)
{
double x, y, dx, dy;
x = r.Get_XMin();
y = r.Get_YMin();
dx = r.Get_XRange();
dy = r.Get_YRange();
if( _Fit_Rectangle(x, y, dx, dy, XToY_Ratio, bShrink) )
{
r.Assign(x, y, x + dx, y + dy);
return( true );
}
return( false );
}
///////////////////////////////////////////////////////////
// //
// //
// //
///////////////////////////////////////////////////////////
//---------------------------------------------------------
bool CSG_Doc_PDF::_Add_Outline_Item(const SG_Char *Title, PdfPage *pPage, TSG_PDF_Title_Level Level)
{
if( m_pPDF && pPage )
{
PdfOutlineItem *pOutlineItem = NULL;
switch( Level )
{
case PDF_TITLE:
pOutlineItem = m_pLastLevel0OutlineItem = new PdfOutlineItem(m_pPDF->Outlines());
break;
case PDF_TITLE_01:
if( m_pLastLevel0OutlineItem )
{
pOutlineItem = m_pLastLevel1OutlineItem = new PdfOutlineItem(m_pLastLevel0OutlineItem);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -