如何判断PdfPage对象是否为空?
How to determine PdfPage object emptiness?
让我们有以下代码片段:
PoDoFo::PdfMemDocument pdfDoc;
pdfDoc.CreatePage( PoDoFo::PdfPage::CreateStandardPageSize( PoDoFo::ePdfPageSize_A4 ) );
新建的页面显然是空的。如何确定这样一个页面是空的(里面没有 xobjects 等)。我试过查找任何类型的方法,如 isEmpty()
或实现我自己的解决方案,如下所示,但没有任何运气。
auto page = src.GetPage( nPage );
if( page->GetContents() == page->GetObject() )
{
// Page is empty
}
// Also tried these checks:
// page->GetResources()->GetObjectLength() == 0
// page->GetResources()->GetStream()->GetLength() == 0
// page->GetResources()->HasStream() == false
由于它具有高优先级,我在深入挖掘 PoDoFo 库以寻找解决方案的同时提出了一个愚蠢的问题。有谁知道我们如何确定页面是否为空?
经过几个痛苦的小时后,我设法解决了这个问题(可以做得更聪明,但无论如何):
/// @param page Page object to be checked for emptiness.
/// @return True in case page is empty, false otherwise.
bool isDocumentPageEmpty( const PoDoFo::PdfPage* page )
{
PoDoFo::PdfContentsTokenizer tokenizer( const_cast<PoDoFo::PdfPage*>( page ) );
PoDoFo::PdfVariant var;
PoDoFo::EPdfContentsType type;
const char* token = nullptr;
while( tokenizer.ReadNext( type, token, var ) )
{
switch( type )
{
case PoDoFo::ePdfContentsType_Keyword:
case PoDoFo::ePdfContentsType_Variant:
{
return false;
}
}
}
return true;
}
让我们有以下代码片段:
PoDoFo::PdfMemDocument pdfDoc;
pdfDoc.CreatePage( PoDoFo::PdfPage::CreateStandardPageSize( PoDoFo::ePdfPageSize_A4 ) );
新建的页面显然是空的。如何确定这样一个页面是空的(里面没有 xobjects 等)。我试过查找任何类型的方法,如 isEmpty()
或实现我自己的解决方案,如下所示,但没有任何运气。
auto page = src.GetPage( nPage );
if( page->GetContents() == page->GetObject() )
{
// Page is empty
}
// Also tried these checks:
// page->GetResources()->GetObjectLength() == 0
// page->GetResources()->GetStream()->GetLength() == 0
// page->GetResources()->HasStream() == false
由于它具有高优先级,我在深入挖掘 PoDoFo 库以寻找解决方案的同时提出了一个愚蠢的问题。有谁知道我们如何确定页面是否为空?
经过几个痛苦的小时后,我设法解决了这个问题(可以做得更聪明,但无论如何):
/// @param page Page object to be checked for emptiness.
/// @return True in case page is empty, false otherwise.
bool isDocumentPageEmpty( const PoDoFo::PdfPage* page )
{
PoDoFo::PdfContentsTokenizer tokenizer( const_cast<PoDoFo::PdfPage*>( page ) );
PoDoFo::PdfVariant var;
PoDoFo::EPdfContentsType type;
const char* token = nullptr;
while( tokenizer.ReadNext( type, token, var ) )
{
switch( type )
{
case PoDoFo::ePdfContentsType_Keyword:
case PoDoFo::ePdfContentsType_Variant:
{
return false;
}
}
}
return true;
}