You are here

webform2pdf.module in Webform2PDF 6.2

Same filename and directory in other branches
  1. 6 webform2pdf.module
  2. 7.4 webform2pdf.module
  3. 7.3 webform2pdf.module

File

webform2pdf.module
View source
<?php

/**
 * This menu appears only if 'Generate PDF' option is enabled
 */
function webform2pdf_enabled_pdf_access() {
  $param = func_get_args();
  $node = array_shift($param);
  $call = array_shift($param);
  $result = db_query("SELECT enabled FROM {webform2pdf} WHERE nid = %d AND enabled = 1", $node->nid);
  $row = db_fetch_array($result);
  return $row['enabled'] && call_user_func_array($call, $param);
}

// function webform2pdf_enabled_pdf_access()

/**
 * Implementation of hook_menu().
 */
function webform2pdf_menu() {
  $items = array();
  $items['node/%webform_menu/webform/webform2pdf'] = array(
    'title' => 'Generate PDF',
    'access callback' => 'node_access',
    'access arguments' => array(
      'update',
      1,
    ),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'webform2pdf_edit_form',
      1,
    ),
    'file' => 'includes/webform2pdf.settings.inc',
    'weight' => 4,
    'type' => MENU_LOCAL_TASK,
  );
  $items['node/%webform_menu/webform-results/downloadpdf'] = array(
    'title' => 'Download PDF',
    'load arguments' => array(
      1,
    ),
    'access callback' => 'webform2pdf_enabled_pdf_access',
    'access arguments' => array(
      1,
      'webform_results_access',
      1,
    ),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'webform2pdf_download_pdf_form',
      1,
    ),
    'file' => 'includes/webform2pdf.download.inc',
    'weight' => 9,
    'type' => MENU_LOCAL_TASK,
  );
  $items['node/%webform_menu/submission/%webform_menu_submission/downloadpdf'] = array(
    'title' => 'Download PDF',
    'load arguments' => array(
      1,
    ),
    'access callback' => 'webform2pdf_enabled_pdf_access',
    'access arguments' => array(
      1,
      'webform_submission_access',
      1,
      3,
      'view',
    ),
    'page callback' => 'webform2pdf_submission_download_pdf',
    'page arguments' => array(
      1,
      3,
    ),
    'file' => 'includes/webform2pdf.download.inc',
    'weight' => 6,
    'type' => MENU_LOCAL_TASK,
  );

  /*  $items['webform2pdf/%'] = array(
      'title' => 'Download PDF',
      'access arguments' => TRUE,
      'page callback' => 'webform2pdf_url_decode',
      'page arguments' => array(1),
      'file' => 'includes/webform2pdf.download.inc',
      'weight' => 4,
      'type' => MENU_CALLBACK,
    );*/
  $items['admin/settings/webform2pdf'] = array(
    'title' => 'Webform to PDF',
    'access arguments' => array(
      'administer site configuration',
    ),
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'webform2pdf_admin_settings',
    ),
    'file' => 'includes/webform2pdf.settings.inc',
    'description' => 'Global configuration of webform2pdf functionality.',
    'type' => MENU_NORMAL_ITEM,
  );
  return $items;
}

// function webform2pdf_menu()

/**
 * Implementation of hook_theme()
 */
function webform2pdf_theme() {
  return array(
    'webform2pdf_download_pdf_form' => array(
      'arguments' => array(
        'form' => NULL,
      ),
      'file' => 'includes/webform2pdf.download.inc',
    ),
    'webform2pdf_pdf_init' => array(
      'arguments' => array(
        'node' => NULL,
        'template' => NULL,
      ),
    ),
    'webform2pdf_pdf_header' => array(
      'arguments' => array(
        'pdf' => NULL,
        'node' => NULL,
        'template' => NULL,
      ),
    ),
    'webform2pdf_pdf_page' => array(
      'arguments' => array(
        'pdf' => NULL,
        'node' => NULL,
        'template' => NULL,
      ),
    ),
    'webform2pdf_pdf_content' => array(
      'arguments' => array(
        'pdf' => NULL,
        'node' => NULL,
        'template' => NULL,
        'tokens' => NULL,
      ),
    ),
    'webform2pdf_pdf_footer' => array(
      'arguments' => array(
        'pdf' => NULL,
        'node' => NULL,
        'template' => NULL,
      ),
    ),
    'webform2pdf_mail2pdf' => array(
      'arguments' => array(
        'nid' => NULL,
        'sid' => NULL,
      ),
    ),
    'webform2pdf_filename' => array(
      'arguments' => array(
        'node' => NULL,
        'submission' => NULL,
      ),
    ),
  );
}

// function webform2pdf_theme()

/**
 * Implementation of hook_help()
 */
function webform2pdf_help($path, $arg) {
  global $base_url;
  switch ($path) {
    case 'node/%/webform-results/downloadpdf':
      return $output = '<p>' . t('A PDF document will be generated from the marked results.') . '</p>';
      break;
  }
}

// function webform2pdf_help()
function webform2pdf_send2pdf($node, $submission) {
  $webform2pdf = _webform2pdf_get_template($node->nid);
  $nopdf = array();
  if (isset($webform2pdf['enabled']) && $webform2pdf['enabled'] && $webform2pdf['pdf_send_email']) {
    $no_mail = unserialize($webform2pdf['no_send_email_addr']);
    if (is_array($no_mail)) {
      $no_mail = array_diff($no_mail, array(
        0,
      ));
      if (!empty($no_mail)) {
        foreach ($no_mail as $eid) {
          $email_addresses = $node->webform['emails'][$eid]['email'];
          if (isset($node->webform['components'][$email_addresses])) {
            $email_addresses = $submission->data[$eid]['value'];
          }
          else {
            $email_addresses = array_filter(explode(',', check_plain($node->webform['emails'][$eid]['email'])));
          }
          if (is_array($email_addresses)) {
            $nopdf = array_merge($nopdf, $email_addresses);
          }
          $nopdf = array_map("trim", $nopdf);
        }
      }
    }

    // Check for a multi-page form that is not yet complete.
    return array(
      'nid' => $node->nid,
      'sid' => $submission->sid,
      'nopdf' => $nopdf,
    );
  }
}

/**
 * Adds a pdf download link to the webform submission page.
 */
function webform2pdf_preprocess_webform_results_submissions(&$vars) {
  $rows =& $vars['table']['#rows'];
  $i = 0;
  $table_row_keys = array_keys($vars['table']['#rows']);
  foreach ($vars['submissions'] as $sid => $submission) {
    if (webform2pdf_enabled_pdf_access($vars['node'], 'webform_submission_access', $vars['node'], $submission->nid, 'view')) {
      $rows[$table_row_keys[$i]][] = l(t('Download PDF'), 'node/' . $submission->nid . '/submission/' . $submission->sid . '/downloadpdf');
    }
    else {
      $rows[$table_row_keys[$i]][] = '';
    }
    $i++;
  }
  $header_keys = array_keys($vars['table']['#header']);
  $last_header_key = array_pop($header_keys);
  $vars['table']['#operation_total'] += 1;
  $vars['table']['#header'][$last_header_key]['colspan'] += 1;
}

/*
 * _webform2pdf_get_file: returns a file array based on file id
 * @param: $fid - file id
 */
function _webform2pdf_get_file($fid) {
  if (is_numeric($fid)) {
    $result = db_query("SELECT * FROM {files} WHERE fid = %d", $fid);
    return db_fetch_object($result);
  }
  return 0;
}

// function _webform2pdf_get_file()

/*
 * _webform2pdf_use_file: check if an other template use the file.
 * @param: $fid - file id
 * @return: the number of templates using the file
 */
function _webform2pdf_use_file($fid) {
  $webform2pdf_default = variable_get('webform2pdf_default', '');
  if (is_numeric($fid)) {
    $SQL = "SELECT count(*) AS num FROM {webform2pdf}";
    $SQL .= " WHERE (h_left_logo = %d) OR (h_right_logo = %d) OR (f_left_logo = %d) OR (f_right_logo = %d)";
    $result = db_query($SQL, $fid, $fid, $fid, $fid);
    $count = db_fetch_array($result);
    if ($webform2pdf_default['h_left_logo'] == $fid) {
      $count['num']++;
    }
    if ($webform2pdf_default['h_right_logo'] == $fid) {
      $count['num']++;
    }
    if ($webform2pdf_default['f_left_logo'] == $fid) {
      $count['num']++;
    }
    if ($webform2pdf_default['f_right_logo'] == $fid) {
      $count['num']++;
    }
    return $count['num'];
  }
  return 0;
}

// function _webform2pdf_use_file()

/*
 * _webform2pdf_list_template_vars: These variables can be used in the template.
 * @param: $node - webform node
 * @param: $submission - submitted values of the webform node
 */
function _webform2pdf_list_template_vars($node) {
  $tokens = array();
  foreach ($node->webform['components'] as $component) {
    switch ($component['type']) {
      case 'select':
        $tokens[] = '%' . $component['form_key'];
        $tokens[] = '%' . $component['form_key'] . '-all';
        $tokens[] = '%' . $component['form_key'] . '-nl';
        $tokens[] = '%' . $component['form_key'] . '-all-nl';
        break;
      case 'number':
      case 'email':
      case 'date':
      case 'time':
      case 'hidden':
      case 'textarea':
      case 'textfield':
      case 'grid':
        $tokens[] = '%' . $component['form_key'];
        break;

      // markup', 'pagebreak', etc.
      default:

        // calling _hook_webform2pdf_list_template_vars hivas, support of extra types
        foreach (module_list() as $module) {
          $function = '_' . $module . '_webform2pdf_list_template_vars';
          if (function_exists($function)) {
            $function($component, $tokens);
          }
        }
        break;
    }
  }
  $tokens[] = '%nid';
  $tokens[] = '%sid';
  return $tokens;
}

// function _webform2pdf_list_template_vars()

/*
 * _webform2pdf_get_template_vars: returns the values of the variables used in the template
 * @param: $node - webform node
 * @param: $submission - submitted values of the webform node
 */
function _webform2pdf_get_template_vars($node, $submission) {
  $tokens = array_flip(_webform2pdf_list_template_vars($node));
  foreach ($tokens as $key => $token) {
    $tokens[$key] = '';
  }
  foreach ($node->webform['components'] as $component) {
    if (!empty($submission->data[$component['cid']]['value']) && isset($component['type'])) {
      switch ($component['type']) {
        case 'date':
          if (!empty($submission->data[$component['cid']]['value'][0])) {
            $timestamp = strtotime($submission->data[$component['cid']]['value'][0] . ' GMT');
            $format = webform_date_format('medium');
            $date = format_date($timestamp, 'custom', $format, 0);
            $tokens['%' . $component['form_key']] = $date;
          }
          else {
            $tokens['%' . $component['form_key']] = '';
          }
          break;
        case 'time':
          if (!empty($submission->data[$component['cid']]['value'][0])) {
            list($hour, $min, $sec) = explode(':', $submission->data[$component['cid']]['value'][0]);
            $ampm = '';
            if ($component['extra']['hourformat'] === '12-hour') {
              if ($hour > 12) {
                $hour -= 12;
                $ampm = t('pm');
              }
              else {
                $ampm = t('am');
              }
            }
            $tokens['%' . $component['form_key']] = trim($hour . ':' . $min . ' ' . $ampm);
          }
          else {
            $tokens['%' . $component['form_key']] = '';
          }
          break;
        case 'grid':
          $answers = $questions = array();
          $a = explode("<nl2br>", preg_replace("/(\r\n)+|(\n|\r)+/", "<nl2br>", $component['extra']['options']));
          $q = explode("<nl2br>", preg_replace("/(\r\n)+|(\n|\r)+/", "<nl2br>", $component['extra']['questions']));
          foreach ($a as $key => $value) {
            if (strpos($value, '|') === FALSE) {
              $key = $option = $value;
            }
            else {
              $key = drupal_substr($value, 0, strpos($value, '|'));
              $option = drupal_substr($value, strpos($value, '|') + 1);
            }
            $answers[$key] = $option;
          }
          foreach ($q as $key => $value) {
            if (strpos($value, '|') === FALSE) {
              $key = $option = $value;
            }
            else {
              $key = drupal_substr($value, 0, strpos($value, '|'));
              $option = drupal_substr($value, strpos($value, '|') + 1);
            }
            $questions[$key] = $option;
          }
          $grid = array();
          foreach ($submission->data[$component['cid']]['value'] as $question => $answer) {
            if (isset($questions[$question]) && isset($answers[$answer])) {
              $grid[] = $questions[$question] . ': ' . $answers[$answer];
            }
          }
          $tokens['%' . $component['form_key']] = implode("<br />\n", $grid);
          break;
        case 'select':

          // in the $component:
          // if aslist=Y, then standard select + if multiple=Y then Multi-select
          // if aslist=N and multiple=Y then checkbox (there is no difference between single, and multivalue)
          // if aslist=N and multiple=N then radiobuton (there is no difference between single, and multivalue)
          $values = $submission->data[$component['cid']]['value'];
          if (is_array($values)) {
            $items = explode("<nl2br>", preg_replace("/(\r\n)+|(\n|\r)+/", "<nl2br>", $component['extra']['items']));
            $options = array();
            foreach ($items as $item) {
              if (strpos($item, '|') === FALSE) {
                $key = $option = $item;
              }
              else {
                $key = drupal_substr($item, 0, strpos($item, '|'));
                $option = drupal_substr($item, strpos($item, '|') + 1);
              }
              $options[$key] = $option;
            }
            $select = $selectNL = $selectAll = $selectAllNL = array();
            foreach ($options as $key => $option) {
              if (in_array($option, $values) || in_array($key, $values)) {
                if (!empty($option)) {
                  $select[] = $option;
                  $selectNL[] = ' - ' . $option . "<br />\n";
                  $selectAll[] = '<u><b><span class="selected">' . $option . '</span></b></u>';
                  $selectAllNL[] = ' [X] ' . $option . "<br />\n";
                }
              }
              else {
                if (!empty($option)) {
                  $selectAll[] = $option;
                  $selectAllNL[] = ' [  ] ' . $option . "<br />\n";
                }
              }
            }

            // select_or_other module support
            if (module_exists('select_or_other')) {
              $potential_values = array_merge(array_keys($options), array_values($options));
              $diff = array_diff($values, $potential_values);
              if (count($diff)) {
                foreach ($diff as $value) {
                  if (!empty($value)) {
                    $select[] = check_plain($value);
                    $selectNL[] = ' - ' . check_plain($value) . "<br />\n";
                    $selectAll[] = '<u><b><span class="selected">' . check_plain($value) . '</span></b></u>';
                    $selectAllNL[] = ' [X] ' . check_plain($value) . "<br />\n";
                  }
                }
              }
            }
            $tokens['%' . $component['form_key']] = implode(', ', $select);
            $tokens['%' . $component['form_key'] . '-all'] = implode(', ', $selectAll);
            $tokens['%' . $component['form_key'] . '-nl'] = implode('', $selectNL);
            $tokens['%' . $component['form_key'] . '-all-nl'] = implode('', $selectAllNL);
          }
          else {
            $tokens['%' . $component['form_key']] = $tokens['%' . $component['form_key'] . '-all'] = $tokens['%' . $component['form_key'] . '-nl'] = $tokens['%' . $component['form_key'] . '-all-nl'] = '';
          }
          break;
        case 'number':
          if (!empty($submission->data[$component['cid']]['value'][0])) {
            $decimals = 0;
            if ($component['extra']['integer']) {
              $decimals = is_numeric($component['extra']['decimals']) ? (int) $component['extra']['decimals'] : 0;
            }
            $tokens['%' . $component['form_key']] = number_format($submission->data[$component['cid']]['value'][0], $decimals, $component['extra']['point'], $component['extra']['separator']);
          }
          else {
            $tokens['%' . $component['form_key']] = '';
          }
          break;
        case 'email':
        case 'hidden':
        case 'textarea':
        case 'textfield':
          if (!empty($submission->data[$component['cid']]['value'][0])) {
            $tokens['%' . $component['form_key']] = str_replace('<br>', '<br />', nl2br(check_plain($submission->data[$component['cid']]['value'][0])));
          }
          else {
            $tokens['%' . $component['form_key']] = '';
          }
          break;

        // markup', 'pagebreak', etc.
        default:

          // _hook_webform2pdf_get_template_vars call, support of extra types
          foreach (module_list() as $module) {
            $function = '_' . $module . '_webform2pdf_get_template_vars';
            if (function_exists($function)) {
              $function($component, $submission, $tokens);
            }
          }
          break;
      }
    }
  }

  // node id
  $tokens['%nid'] = $node->nid;

  // submission id
  $tokens['%sid'] = $submission->sid;

  // hook_webform2pdf_tokens($tokens, $node, $submission): modify values of $tokens array
  drupal_alter('webform2pdf_tokens', $tokens, $node, $submission);
  return $tokens;
}

// function _webform2pdf_get_template_vars()

/*
 * _webform2pdf_get_template: returns the PDF settings of the given webform
 */
function _webform2pdf_get_template($nid) {
  $result = db_query("SELECT * FROM {webform2pdf} WHERE nid = %d AND enabled = 1", $nid);
  $row = db_fetch_array($result);
  $row['p_body'] = check_markup($row['p_body'], $row['format'], FALSE);
  return $row;
}

// function _webform2pdf_get_template()

/**
 * Return all the submissions for a particular node.
 * Original function webform module: webform_get_submissions.
 *
 * @param $nid
 *   The node ID for which submissions are being fetched.
 * @param $header
 *   If the results of this fetch will be used in a sortable
 *   table, pass the array header of the table.
 * @param $sids
 *   Optional; the submissions ID to filter the submissions by.
 * @return $submissions
 *   An array of submissions matching your filters.
 */
function _webform2pdf_get_submissions($nid, $header = NULL, $sids = array()) {
  $SQL = 'SELECT s.*, sd.cid, sd.no, sd.data, u.name, u.mail, u.status';
  $SQL .= ' FROM {webform_submissions} s';
  $SQL .= ' LEFT JOIN {webform_submitted_data} sd ON sd.sid = s.sid';
  $SQL .= ' LEFT JOIN {users} u ON u.uid = s.uid';
  $SQL .= ' WHERE sd.nid = %d';
  if (count($sids)) {
    $SQL .= ' AND s.sid IN (%s)';
  }
  if (is_array($header)) {
    $SQL .= tablesort_sql($header);
    if (!isset($header[0]['sort'])) {
      $SQL .= ', sid ASC';
    }
    $SQL .= ', cid ASC, no ASC';
  }
  else {
    $SQL .= ' ORDER BY sid ASC, cid ASC, no ASC';
  }
  $result = db_query($SQL, $nid, implode(',', $sids));
  $submissions = array();
  $previous = array();

  // Outer loop: iterate for each submission.
  while ($row = db_fetch_object($result)) {
    if ($row->sid != $previous) {
      $submissions[$row->sid] = new stdClass();
      $submissions[$row->sid]->sid = $row->sid;
      $submissions[$row->sid]->submitted = $row->submitted;
      $submissions[$row->sid]->remote_addr = $row->remote_addr;
      $submissions[$row->sid]->uid = $row->uid;
      $submissions[$row->sid]->name = $row->name;
      $submissions[$row->sid]->status = $row->status;
    }
    $submissions[$row->sid]->data[$row->cid]['value'][$row->no] = $row->data;
    $previous = $row->sid;
  }
  return $submissions;
}

// function _webform2pdf_get_submissions()
function theme_webform2pdf_filename($node, $submission) {
  $sid = is_object($submission) ? $submission->sid : $submission;
  $pdf_file_name = "webform_submission-" . $node->nid;
  $pdf_file_name .= !empty($sid) ? '-' . $sid : '';
  $pdf_file_name .= ".pdf";
  return $pdf_file_name;
}

/*
 * _webform2pdf_init_tcpdf: PDF initializing
 */
function _webform2pdf_init_tcpdf($node, $template) {
  global $base_url;
  $default = variable_get('webform2pdf_default', '');
  define('K_TCPDF_EXTERNAL_CONFIG', TRUE);
  define('K_PATH_MAIN', dirname($_SERVER['SCRIPT_FILENAME']));
  define('K_PATH_URL', $base_url);
  define('K_PATH_FONTS', $default['pdf_lib'] . '/fonts/');
  define('K_PATH_CACHE', $default['pdf_lib'] . '/cache/');
  define('K_PATH_IMAGES', '');
  define('K_BLANK_IMAGE', $default['pdf_lib'] . '/images/_blank.png');
  define('K_CELL_HEIGHT_RATIO', 1.25);
  define('K_SMALL_RATIO', 2 / 3);
  if (is_file($default['pdf_lib'] . '/tcpdf.php')) {
    include_once drupal_get_path('module', 'webform2pdf') . '/webform2pdf.class.inc';
    $font = array(
      variable_get('print_pdf_font_family', PRINT_PDF_FONT_FAMILY_DEFAULT),
      '',
      variable_get('print_pdf_font_size', PRINT_PDF_FONT_SIZE_DEFAULT),
    );

    // create new PDF document
    $pdf = new W2PDF($template['page_orientation'], 'mm', $template['page_format'], TRUE);

    // set document information
    $pdf
      ->SetCreator(variable_get('site_name', 'Drupal'));
    $pdf
      ->SetAuthor($node->name);
    $pdf
      ->SetTitle($node->title);
    $pdf
      ->setPDFVersion('1.6');
    return $pdf;
  }
  else {
    return;
  }
}

// function _webform2pdf_init_tcpdf()

/*
 * theme_webform2pdf_pdf_init: pdf initializing, theme hook
 */
function theme_webform2pdf_pdf_init($node, $template) {
  return _webform2pdf_init_tcpdf($node, $template);
}

// function theme_webform2pdf_pdf_init()

/*
 * _webform2pdf_pdf_header: pdf header data
 */
function _webform2pdf_pdf_header($pdf, $node, $template) {
  if (!empty($template['h_left_logo'])) {
    $f = _webform2pdf_get_file($template['h_left_logo']);
    $s = getimagesize($f->filepath);
    $logo['left'] = $f->filepath;

    // 75dpi image, image size convert millimeter
    $size['left']['w'] = $s[0] / 75 * 25;
    $size['left']['h'] = $s[1] / 75 * 25;
  }
  if (!empty($template['h_right_logo'])) {
    $f = _webform2pdf_get_file($template['h_right_logo']);
    $s = getimagesize($f->filepath);
    $logo['right'] = $f->filepath;

    // 75dpi image, image size convert millimeter
    $size['right']['w'] = $s[0] / 75 * 25;
    $size['right']['h'] = $s[1] / 75 * 25;
  }

  // set header font
  $pdf
    ->setHeaderFont(array(
    $template['h_font_family'],
    '',
    $template['h_font_size'],
  ));

  // set header margin
  $pdf
    ->setHeaderMargin(5);

  // webform filter
  $header_msg = nl2br(_webform_filter_values($template['h_txt'], $node, NULL, NULL, FALSE));

  // set header data
  $pdf
    ->setHeaderData($logo, $size, $header_msg, $template['h_txt_align']);
  return $pdf;
}

// function _webform2pdf_pdf_header()

/*
 * _webform2pdf_pdf_header: pdf header theme hook
 */
function theme_webform2pdf_pdf_header($pdf, $node, $template) {
  return _webform2pdf_pdf_header($pdf, $node, $template);
}

// function theme_webform2pdf_pdf_header()

/*
 * _webform2pdf_pdf_footer: pdf footer data
 */
function _webform2pdf_pdf_footer($pdf, $node, $template) {
  if (!empty($template['f_left_logo'])) {
    $f = _webform2pdf_get_file($template['f_left_logo']);
    $s = getimagesize($f->filepath);
    $logo['left'] = $f->filepath;

    // 75dpi image, image size convert millimeter
    $size['left']['w'] = $s[0] / 75 * 25;
    $size['left']['h'] = $s[1] / 75 * 25;
  }
  if (!empty($template['f_right_logo'])) {
    $f = _webform2pdf_get_file($template['f_right_logo']);
    $s = getimagesize($f->filepath);
    $logo['right'] = $f->filepath;

    // 75dpi image, image size convert millimeter
    $size['right']['w'] = $s[0] / 75 * 25;
    $size['right']['h'] = $s[1] / 75 * 25;
  }

  // set footer font
  $pdf
    ->setFooterFont(array(
    $template['f_font_family'],
    '',
    $template['f_font_size'],
  ));

  // set footer margin
  $pdf
    ->setFooterMargin(5);

  // webform filter
  $footer_msg = nl2br(_webform_filter_values($template['f_txt'], $node, NULL, NULL, FALSE));

  // set footer data
  $pdf
    ->SetFooterData($logo, $size, $footer_msg, $template['f_txt_align']);
  return $pdf;
}

// function _webform2pdf_pdf_footer()

/*
 * theme_webform2pdf_pdf_footer: pdf footer theme hook
 */
function theme_webform2pdf_pdf_footer($pdf, $node, $template) {
  return _webform2pdf_pdf_footer($pdf, $node, $template);
}

// function theme_webform2pdf_pdf_footer()

/*
 * _webform2pdf_pdf_page: pdf page init
 */
function _webform2pdf_pdf_page($pdf) {

  // set margins
  $pdf
    ->SetMargins(15, 20, 15);

  // set auto page breaks
  $pdf
    ->SetAutoPageBreak(TRUE, 25);

  // set image scale factor
  $pdf
    ->setImageScale(4);

  // set image compression quality
  $pdf
    ->setJPEGQuality(100);
  return $pdf;
}

// function _webform2pdf_pdf_page()

/*
 * theme_webform2pdf_pdf_page: pdf page theme hook
 */
function theme_webform2pdf_pdf_page($pdf) {
  return _webform2pdf_pdf_page($pdf);
}

// function theme_webform2pdf_pdf_page()

/*
 * _webform2pdf_pdf_content: Fills PDF page with content
 */
function _webform2pdf_pdf_content($pdf, $node, $template, $tokens) {
  $pdf
    ->SetFont($template['p_font_family'], '', $template['p_font_size']);
  foreach ($template['pages'] as $page) {

    // add a page
    $pdf
      ->AddPage();

    // webform filter
    $page = _webform_filter_values($page, $node, NULL, NULL, FALSE);
    $pdf
      ->writeHTML($page, TRUE, FALSE, FALSE, FALSE, $template['p_txt_align']);
  }
  return $pdf;
}

// function _webform2pdf_pdf_content()

/*
 * theme_webform2pdf_pdf_content: pdf content theme hook
 */
function theme_webform2pdf_pdf_content($pdf, $node, $template, $tokens) {
  return _webform2pdf_pdf_content($pdf, $node, $template, $tokens);
}

// function theme_webform2pdf_pdf_content()

/*
 * webform2pdf_mail_alter: hook_mail_alter
 */
function webform2pdf_mail_alter(&$message) {
  if ($message['id'] == 'webform_submission') {
    $webform2pdf_send2pdf = webform2pdf_send2pdf($message['params']['node'], $message['params']['submission']);
    if (isset($webform2pdf_send2pdf['nid'])) {
      $attach_pdf = 1;
      if (!empty($webform2pdf_send2pdf['nopdf'])) {
        if (in_array($message['to'], $webform2pdf_send2pdf['nopdf'])) {
          $attach_pdf = 0;
        }
      }
      if ($attach_pdf) {
        if (module_exists('mimemail')) {
          $node = node_load($webform2pdf_send2pdf['nid']);
          $attachment = new stdClass();
          $attachment->filecontent = theme('webform2pdf_mail2pdf', $webform2pdf_send2pdf['nid'], $webform2pdf_send2pdf['sid']);
          $attachment->filename = theme('webform2pdf_filename', $node, $webform2pdf_send2pdf['sid']);
          $attachment->filemime = 'application/pdf';
          $message['params']['attachments'][] = $attachment;
        }
        else {
          $trenner = '------------' . md5(uniqid(time()));
          $content_type = $message['headers']['Content-Type'];
          $message['headers']['Content-Type'] = 'multipart/mixed; boundary="' . $trenner . '"';
          unset($message['headers']['Content-Transfer-Encoding']);
          $body = "\n--" . $trenner . "\n" . "Content-Type: " . $content_type . "\n" . "Content-Transfer-Encoding: 8bit\n\n";
          $body .= is_array($message['body']) ? drupal_wrap_mail(implode("\n\n", $message['body'])) : drupal_wrap_mail($message['body']);
          unset($message['body']);
          $message['body'] = $body;
          unset($body);
          $node = node_load($webform2pdf_send2pdf['nid']);
          $filename = theme('webform2pdf_filename', $node, $webform2pdf_send2pdf['sid']);
          unset($node);
          $message['body'] .= "\n\n--" . $trenner . "\n";
          $message['body'] .= "Content-Type: application/pdf; name=\"" . $filename . "\"\n";
          $message['body'] .= "Content-Transfer-Encoding: base64\n";
          $message['body'] .= "Content-Disposition: attachment; filename=\"" . $filename . "\"\n\n";
          $message['body'] .= chunk_split(base64_encode(theme('webform2pdf_mail2pdf', $webform2pdf_send2pdf['nid'], $webform2pdf_send2pdf['sid'])));
          $message['body'] .= "\n\n";
          $message['body'] .= "--" . $trenner . "--";
        }
      }
    }
  }
}

// function webform2pdf_mail_alter()

/*
 * theme_webform2pdf_mail2pdf(): mail attachment pdf
 */
function theme_webform2pdf_mail2pdf($nid, $sid) {
  $node = node_load(array(
    'nid' => $nid,
  ));
  $submissions = _webform2pdf_get_submissions($nid, NULL, array(
    $sid,
  ));
  $token = _webform2pdf_get_template_vars($node, $submissions[$sid]);
  $template = _webform2pdf_get_template($node->nid);
  $pdf = theme('webform2pdf_pdf_init', $node, $template);
  if (!empty($pdf)) {
    $pdf = theme('webform2pdf_pdf_header', $pdf, $node, $template);
    $pdf = theme('webform2pdf_pdf_footer', $pdf, $node, $template);
    $pdf = theme('webform2pdf_pdf_page', $pdf);

    // todo: @deprecated deprecated since version 5.9.089 (2011-06-13)
    if (method_exists($pdf, 'AliasNbPages')) {

      // initialize document
      $pdf
        ->AliasNbPages();
    }
    $template['pages'] = explode('%pagebreak', $template['p_body']);
    foreach ($template['pages'] as $key => $page) {
      $template['pages'][$key] = strtr($page, $token);
    }
    $pdf = theme('webform2pdf_pdf_content', $pdf, $node, $template, $token);

    // reset pointer to the last page
    $pdf
      ->lastPage();

    // Return PDF document
    return $pdf
      ->Output($filename, 'S');
  }
}

// function theme_webform2pdf_mail2pdf()

/*
 * webform2pdf_url_encode: pdf download anonymous url generation.
 */
function webform2pdf_url_encode($nid, $sid, $encode = TRUE) {
  $url = 'node/' . $nid . '/submission/' . $sid . '/downloadpdf';
  if ($encode && function_exists('mcrypt_encrypt')) {
    $key = variable_get('webform2pdf_key', '');
    return 'webform2pdf/' . urlencode(trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $url, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))));
  }
  return $url;
}

// function webform2pdf_url_encode()