⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bpdfobject.cpp

📁 这是一个PDF文件查看的程序
💻 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 + -