// This file is part of Extract PDFmark.
//
// Copyright (C) 2016, 2019 Masamichi Hosoda
//
// Extract PDFmark is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Extract PDFmark 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Extract PDFmark. If not, see .
#include "config.h"
#include "poppler-glib.hh"
#include
#include
#include
#include
gboolean poppler_glib::walk_entry (gpointer key,
gpointer value,
gpointer user_data)
{
gchar *name = static_cast (key);
PopplerDest *dest = static_cast (value);
poppler_glib *pg = static_cast (user_data);
return pg->walk (name, dest);
}
bool poppler_glib::walk (gchar *name, PopplerDest *dest)
{
gsize len;
void *data {poppler_named_dest_to_bytestring (name, &len)};
std::string n {static_cast (data),
static_cast (len)};
std::stringstream ss;
if (dest)
{
switch (dest->type)
{
case POPPLER_DEST_XYZ:
ss
<< "[ /Dest " << encode_name (n)
<< " /Page " << dest->page_num
<< " /View [/XYZ " << dest->left
<< " " << dest->top
<< " " << dest->zoom
<< "] /DEST pdfmark" << std::endl;
break;
case POPPLER_DEST_FIT:
ss
<< "[ /Dest " << encode_name (n)
<< " /Page " << dest->page_num
<< " /View [/Fit] /DEST pdfmark" << std::endl;
break;
case POPPLER_DEST_FITH:
ss
<< "[ /Dest " << encode_name (n)
<< " /Page " << dest->page_num
<< " /View [/FitH " << dest->top
<< "] /DEST pdfmark" << std::endl;
break;
case POPPLER_DEST_FITV:
ss
<< "[ /Dest " << encode_name (n)
<< " /Page " << dest->page_num
<< " /View [/FitV " << dest->left
<< "] /DEST pdfmark" << std::endl;
break;
case POPPLER_DEST_FITR:
ss
<< "[ /Dest " << encode_name (n)
<< " /Page " << dest->page_num
<< " /View [/FitR " << dest->left
<< " " << dest->bottom
<< " " << dest->right
<< " " << dest->top
<< "] /DEST pdfmark" << std::endl;
break;
case POPPLER_DEST_FITB:
ss
<< "[ /Dest " << encode_name (n)
<< " /Page " << dest->page_num
<< " /View [/FitB] /DEST pdfmark" << std::endl;
break;
case POPPLER_DEST_FITBH:
ss
<< "[ /Dest " << encode_name (n)
<< " /Page " << dest->page_num
<< " /View [/FitBH " << dest->top
<< "] /DEST pdfmark" << std::endl;
break;
case POPPLER_DEST_FITBV:
ss
<< "[ /Dest " << encode_name (n)
<< " /Page " << dest->page_num
<< " /View [/FitBV " << dest->left
<< "] /DEST pdfmark" << std::endl;
break;
default:
ss << "% dest type is unknown." << std::endl;
break;
}
}
else
{
ss << "% dest is null." << std::endl;
}
dests += ss.str ();
// return value is used for GTraverseFunc ()'s return value.
// false means to continue the travarsal (true means to stop)
return false;
}
std::string poppler_glib::destname (void)
{
std::unique_ptr
tree {poppler_document_create_dests_tree (document), g_tree_destroy};
dests.clear ();
g_tree_foreach (tree.get (), walk_entry, this);
std::string tmp {std::move(dests)};
dests.clear ();
return tmp;
}