📄 bpdfobject.cpp
字号:
// BPdfObject.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "BPdf.h"
#include "BPdfObject.h"
CBXrefEntry::CBXrefEntry()
{
}
CBXrefEntry::CBXrefEntry(DWORD dwObjectNumber, DWORD dwOffset)
{
m_dwObjectNumber = dwObjectNumber;
m_dwOffset = dwOffset;
};
///////////////////////////////////////
CBPdfObject::CBPdfObject(CBPdfObject* pobjParent)
{
m_pobjParent = pobjParent;
}
CBPdfObject::~CBPdfObject()
{
}
DWORD CBPdfObject::GetImage()
{
return 0;
}
CBPdfObject* CBPdfObject::GetParent()
{
return m_pobjParent;
}
CString CBPdfObject::GetType()
{
return "";
}
void CBPdfObject::Draw(CBPdf* ppdf, CTreeCtrl* ptree, HTREEITEM hti, DWORD dwDepth, DWORD dwMaxDepth)
{
}
void CBPdfObject::SaveAsDot(CBPdf* ppdf, CStdioFile* pfile, CString strParent, DWORD dwDepth, DWORD dwMaxDepth)
{
}
void CBPdfObject::SaveAsDotVerbose(CBPdf* ppdf, CStdioFile* pfile, CString strParent, DWORD dwDepth, DWORD dwMaxDepth)
{
}
void CBPdfObject::SaveAsText(CBPdf* ppdf, FILE* pfile, CString strParent, DWORD dwDepth, DWORD dwMaxDepth)
{
}
///////////////////////////////////////
CBPdfArray::CBPdfArray(CBPdfObject* pobjParent) : CBPdfObject(pobjParent)
{
}
CBPdfArray::~CBPdfArray()
{
for (DWORD i = 0; i < (DWORD)m_array.GetCount(); i++)
{
CBPdfObject* pobj = (CBPdfObject*)m_array[i];
delete pobj;
}
}
DWORD CBPdfArray::GetImage()
{
return 7;
}
CString CBPdfArray::GetType()
{
return "Array";
}
void CBPdfArray::Draw(CBPdf* ppdf, CTreeCtrl* ptree, HTREEITEM htiParent, DWORD dwDepth, DWORD dwMaxDepth)
{
if (dwDepth >= dwMaxDepth)
return;
dwDepth++;
for (DWORD i = 0; i < (DWORD)m_array.GetCount(); i++)
{
CBPdfObject* pobj = (CBPdfObject*)m_array[i];
pobj->Draw(ppdf, ptree, htiParent, dwDepth, dwMaxDepth);
}
dwDepth--;
}
void CBPdfArray::SaveAsDot(CBPdf* ppdf, CStdioFile* pfile, CString strParent, DWORD dwDepth, DWORD dwMaxDepth)
{
if (dwDepth >= dwMaxDepth)
return;
dwDepth++;
CString str;
CString strLine;
if (dwDepth == 1)
{
pfile->WriteString("///////////////\n");
str.Format("\"%s\" [fillcolor=peachpuff]\n", strParent.GetBuffer(0));
pfile->WriteString(str);
}
for (DWORD i = 0; i < (DWORD)m_array.GetCount(); i++)
{
CBPdfObject* pobj = (CBPdfObject*)m_array[i];
if (pobj->GetType() == "Reference")
{
CBPdfReference* pref = (CBPdfReference*)pobj;
str = pref->GetString().Left(pref->GetString().GetLength() - 2);
strLine.Format("\"%s\" -> \"%s\"\n", strParent.GetBuffer(0), str.GetBuffer(0));
pfile->WriteString(strLine);
}
else
pobj->SaveAsDot(ppdf, pfile, strParent, dwDepth, dwMaxDepth);
}
dwDepth--;
}
void CBPdfArray::Add(CBPdfObject* pobj)
{
m_array.Add(pobj);
}
///////////////////////////////////////
CBPdfDictionary::CBPdfDictionary(CBPdfObject* pobjParent) : CBPdfObject(pobjParent)
{
}
CBPdfDictionary::~CBPdfDictionary()
{
POSITION pos = m_map.GetStartPosition();
while (pos != NULL)
{
CString string;
CBPdfObject* pobj;
m_map.GetNextAssoc(pos, string, pobj);
delete pobj;
}
}
DWORD CBPdfDictionary::GetImage()
{
return 8;
}
CString CBPdfDictionary::GetType()
{
return "Dictionary";
}
void CBPdfDictionary::Draw(CBPdf* ppdf, CTreeCtrl* ptree, HTREEITEM htiParent, DWORD dwDepth, DWORD dwMaxDepth)
{
if (dwDepth >= dwMaxDepth)
return;
dwDepth++;
POSITION pos = m_map.GetStartPosition();
while (pos != NULL)
{
CString string;
CBPdfObject* pobj;
m_map.GetNextAssoc(pos, string, pobj);
CString str;
str = string + " (" + pobj->GetType() + ")";
TVINSERTSTRUCT tvis;
tvis.hInsertAfter = TVI_FIRST;
tvis.hParent = htiParent;
tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT;
tvis.item.cchTextMax = str.GetLength();
tvis.item.iImage = pobj->GetImage();
tvis.item.iSelectedImage = pobj->GetImage();
tvis.item.lParam = (LPARAM)pobj;
tvis.item.pszText = str.GetBuffer(0);
HTREEITEM hti = ptree->InsertItem(&tvis);
pobj->Draw(ppdf, ptree, hti, dwDepth, dwMaxDepth);
}
dwDepth--;
}
void CBPdfDictionary::SaveAsDot(CBPdf* ppdf, CStdioFile* pfile, CString strParent, DWORD dwDepth, DWORD dwMaxDepth)
{
if (dwDepth >= dwMaxDepth)
return;
dwDepth++;
CString str;
CString strLine;
if (dwDepth == 1)
{
pfile->WriteString("///////////////\n");
str.Format("\"%s\" [fillcolor=khaki]\n", strParent.GetBuffer(0));
pfile->WriteString(str);
}
POSITION pos = m_map.GetStartPosition();
while (pos != NULL)
{
CString string;
CBPdfObject* pobj;
m_map.GetNextAssoc(pos, string, pobj);
if (pobj->GetType() == "Reference")
{
CBPdfReference* pref = (CBPdfReference*)pobj;
str = pref->GetString().Left(pref->GetString().GetLength() - 2);
strLine.Format("\"%s\" -> \"%s\"\n", strParent.GetBuffer(0), str.GetBuffer(0));
pfile->WriteString(strLine);
}
else
pobj->SaveAsDot(ppdf, pfile, strParent, dwDepth, dwMaxDepth);
}
dwDepth--;
}
BOOL CBPdfDictionary::Lookup(CString strKey, CBPdfObject** ppobj)
{
return m_map.Lookup(strKey, *ppobj);
}
void CBPdfDictionary::Add(CString strKey, CBPdfObject* pobj)
{
CBPdfObject* pobj0;
if (m_map.Lookup(strKey, pobj0))
{
AfxMessageBox("Item already exists in dictionary.");
AfxThrowUserException();
}
m_map.SetAt(strKey, pobj);
}
///////////////////////////////////////
CBPdfReference::CBPdfReference(CBPdfObject* pobjParent, CString str) : CBPdfObject(pobjParent)
{
m_str = str;
m_pobj = NULL;
}
CBPdfReference::~CBPdfReference()
{
if (m_pobj != NULL)
delete m_pobj;
}
CString CBPdfReference::GetString()
{
return m_str;
}
DWORD CBPdfReference::GetImage()
{
return 5;
}
CString CBPdfReference::GetType()
{
return "Reference";
}
void CBPdfReference::Draw(CBPdf* ppdf, CTreeCtrl* ptree, HTREEITEM htiParent, DWORD dwDepth, DWORD dwMaxDepth)
{
ASSERT(m_pobj == NULL);
if (dwDepth >= dwMaxDepth)
return;
dwDepth++;
CBPdfObject* pobj = GetParent();
for (;;)
{
if (pobj == NULL)
break;
if (pobj->GetType() == "Reference")
{
CBPdfReference* pobjRef = (CBPdfReference*)pobj;
if (pobjRef->GetString() == m_str)
{
CString str;
str = m_str + " (Reference)";
TVINSERTSTRUCT tvis;
tvis.hInsertAfter = TVI_FIRST;
tvis.hParent = htiParent;
tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT;
tvis.item.cchTextMax = str.GetLength();
tvis.item.iImage = 6;
tvis.item.iSelectedImage = 6;
tvis.item.lParam = NULL;
tvis.item.pszText = str.GetBuffer(0);
HTREEITEM hti = ptree->InsertItem(&tvis);
dwDepth--;
return;
}
}
pobj = pobj->GetParent();
}
if (ppdf->GotoReference(m_str))
{
m_pobj = ppdf->GetObject(this);
CString str;
str = m_str + " (" + m_pobj->GetType() + ")";
TVINSERTSTRUCT tvis;
tvis.hInsertAfter = TVI_FIRST;
tvis.hParent = htiParent;
tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT;
tvis.item.cchTextMax = str.GetLength();
tvis.item.iImage = m_pobj->GetImage();
tvis.item.iSelectedImage = m_pobj->GetImage();
tvis.item.lParam = (LPARAM)m_pobj;
tvis.item.pszText = str.GetBuffer(0);
HTREEITEM hti = ptree->InsertItem(&tvis);
m_pobj->Draw(ppdf, ptree, hti, dwDepth, dwMaxDepth);
}
else
{
CString str;
str = m_str + " (Null Reference)";
TVINSERTSTRUCT tvis;
tvis.hInsertAfter = TVI_FIRST;
tvis.hParent = htiParent;
tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT;
tvis.item.cchTextMax = str.GetLength();
tvis.item.iImage = 1;
tvis.item.iSelectedImage = 1;
tvis.item.lParam = NULL;
tvis.item.pszText = str.GetBuffer(0);
ptree->InsertItem(&tvis);
}
dwDepth--;
}
void CBPdfReference::SaveAsDot(CBPdf* ppdf, CStdioFile* pfile, CString strParent, DWORD dwDepth, DWORD dwMaxDepth)
{
}
///////////////////////////////////////
CBPdfStream::CBPdfStream(CBPdfObject* pobjParent, CBPdfDictionary* pdict, DWORD dwPos, DWORD dwSize) : CBPdfObject(pobjParent)
{
m_pdict = pdict;
m_dwPos = dwPos;
m_dwSize = dwSize;
}
CBPdfStream::~CBPdfStream()
{
delete m_pdict;
}
DWORD CBPdfStream::GetImage()
{
return 9;
}
CString CBPdfStream::GetType()
{
return "Stream";
}
void CBPdfStream::Draw(CBPdf* ppdf, CTreeCtrl* ptree, HTREEITEM htiParent, DWORD dwDepth, DWORD dwMaxDepth)
{
m_pdict->Draw(ppdf, ptree, htiParent, dwDepth, dwMaxDepth);
}
void CBPdfStream::SaveAsDot(CBPdf* ppdf, CStdioFile* pfile, CString strParent, DWORD dwDepth, DWORD dwMaxDepth)
{
if (dwDepth >= dwMaxDepth)
return;
dwDepth++;
dwDepth--;
m_pdict->SaveAsDot(ppdf, pfile, strParent, dwDepth, dwMaxDepth);
dwDepth++;
dwDepth--;
}
DWORD CBPdfStream::GetStreamPos()
{
return m_dwPos;
}
DWORD CBPdfStream::GetStreamSize()
{
return m_dwSize;
}
///////////////////////////////////////
CBPdfValue::CBPdfValue(CBPdfObject* pobjParent, CString str) : CBPdfObject(pobjParent)
{
m_str = str;
}
CBPdfValue::~CBPdfValue()
{
}
DWORD CBPdfValue::GetImage()
{
return 4;
}
CString CBPdfValue::GetString()
{
return m_str;
}
CString CBPdfValue::GetType()
{
return "Value";
}
void CBPdfValue::Draw(CBPdf* ppdf, CTreeCtrl* ptree, HTREEITEM htiParent, DWORD dwDepth, DWORD dwMaxDepth)
{
if (dwDepth >= dwMaxDepth)
return;
dwDepth++;
TVINSERTSTRUCT tvis;
tvis.hInsertAfter = TVI_FIRST;
tvis.hParent = htiParent;
tvis.item.mask = TVIF_IMAGE | TVIF_PARAM | TVIF_SELECTEDIMAGE | TVIF_TEXT;
tvis.item.cchTextMax = m_str.GetLength();
tvis.item.iImage = GetImage();
tvis.item.iSelectedImage = GetImage();
tvis.item.lParam = NULL;
tvis.item.pszText = m_str.GetBuffer(0);
ptree->InsertItem(&tvis);
dwDepth--;
}
void CBPdfValue::SaveAsDot(CBPdf* ppdf, CStdioFile* pfile, CString strParent, DWORD dwDepth, DWORD dwMaxDepth)
{
if (dwDepth >= dwMaxDepth)
return;
dwDepth++;
CString str;
if (dwDepth == 1)
{
pfile->WriteString("///////////////\n");
str.Format("\"%s\" [fillcolor=azure]\n", strParent.GetBuffer(0));
pfile->WriteString(str);
}
dwDepth--;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -