Печать в PDF - как убрать колонтитул

Тема в разделе "Программирование", создана пользователем OlegKor, 28.10.2009.

  1. Offline

    OlegKor Недавно здесь

    Регистрация:
    02.03.2009
    Сообщения:
    30
    Симпатии:
    0
    Пол:
    Мужской
    Приветствую всех.

    Разрабатываю свой компонент и делаю вывод данных для печати в PDF, при этом использую $format=pdf

    В общем все работает и я получаю нужные сведения, но у меня серьезная проблема в том, что я вывожу данные для печати на бланке, а сформированный PDF выводит нужные мне сведения ( в нужных местах) НО с колонтитулами --- верхний "заголовок сайта" и нижний "номера страниц" мне это не нужно ...

    Как от этого можно избавиться? Подскажите пожалуйста...
     
  2.  
  3. Offline

    OlegKor Недавно здесь

    Регистрация:
    02.03.2009
    Сообщения:
    30
    Симпатии:
    0
    Пол:
    Мужской
    Спустя 4 суток. я нашел решение. по крайней мере для себя.
    Но, возможно не только я сталкиваюсь с такими задачами, и я решил кое что пояснить в их реализации.

    1. Нам изначално известно, что в пакет Joomla 1.5 уже интегрирован механизм формирования и отображения контента в формат PDF на базе библиотеки TCPDF. И нам так же известно, что (используя MVC) достаточно создать файл view.pdf.php рядом с view.html.php и ссылаясь на него из шаблона как-то похоже на это:
    Но выводимый результат предопределен в ../libraries/joomla/document/pdf/pdf.php что-либо здесь поправить ведет только (или в большей мере) к потере времени ... ну и это изменение ядра Joomla, что не желательно в принципе. Остается одно - создать файл view.pdf.php и в нем все решить.

    И так, создадим view.pdf.php и в нем пропишем что-то похожее на это;
    // Запрещаем прямой доступ
    defined('_JEXEC') or die('Прямой доступ запрещен');
    // Будем наследовать объект View
    require_once JPATH_COMPONENT.DS.'view.php';
    // Если понадобятся данные, нам надо подключить Модель из которой мы их получим
    require_once JPATH_COMPONENT.DS.'models'.DS.'mymodel.php';

    //Создадим свой View=класс
    class MynamecomponentViewMynamecontroller extends MynamecomponentView
    {

    //Возможно, мы захотим получать данные, тогда нам понадобится объект MODEL тут мы его получим
    function &getModel()
    {
    static $model = null;
    if ($model === null){
    $model = new MynamecomponentModelMymodel();
    }
    return $model;
    }

    //Далее нам надо будет отобразить результат
    function display( $tpl = null )
    {

    //В ссылке мы передавали (в моем случае) значение ID объекта, тут его прочитаем
    $id = JRequest::getInt('id', 0);

    //Проверяем все ли у нас есть то, что мы ожидаем ...
    if( $id && $this->getLayout() == 'default' ){

    А ВОТ ТУТ И НАЧИНАЕТСЯ САМОЕ ИНТЕРЕСНОЕ и что приводит в заблуждение ну и что следует понять:
    Ошибка. Когда мы пытаемся здесь прописать или передать (возвратить из функции) сюда объект ... что то созданное в виде
    $pdf = new TCPDF();
    Мы непременно получим ошибку, потому что пытаемся отобразить вместо HTML данные в бинарном виде.
    Решение. Чтобы получить желаемый результат без ошибки, нам надо сформировать и выполнить PDF в отдельной функции, например:
    $this->showPDF();
    При этом функция ни в коем случае не должна ничего возвращать в function display - иначе БУДЕТ ОШИБКА ... Вернее мы сюда можем предать (вернуть или написать изначально) текст или форматированный HTML --- предопределенный механизм это отработает правильно и без проблем, а так же отобразит на экране в предопределенном формате. МЫ не должны сюда возвращать по типу ДАННЫЕ как-либо отличающиеся от ТЕКСТА ..
    Естественно в этом классе нам надо создать функцию с именем (например) showPDF, где все обработается и выполнится...

    }
    }
    function showPDF()
    {
    Здесь мы пишем все. что нам надо обработать и выполнить. Т.е. именно тут мы сформируем и выведем на экран PDF-файл. Ну и об этом и о моей проблеме. а так же о том как я ее решил я опишу ниже ...
    }
    }

    2. Ближе к PDF и к решению проблемы. И так, мне было необходимо избавиться от колнтитулов. чтобы писать нужные данные-текст на бумажном бланке. Попытки сделать это через
    $document=& JFactory::getDocument();
    $document->setTitle(false);
    $document->setName(false);
    делают свое дело, но к нужному результату не приводят. Нам надо изменить установки TCPDF, переопределить свойства ... для этого делаем свою функцию showPDF()

    function showPDF()
    {
    //Если нам нужны данные - получим из из Model
    $model =& $this->getModel();
    $row =& $model->getRow();
    //Теперь в $row находится массив с данными .. как с ним работать Вам наверное известно иил вы узнаете в другом посте .. Моя цель объяснить о другом .

    Далее Вы конечно могли бы попробовать подключить библиотеку TCPDF приблизительно так:
    require_once JPATH_LIBRARIES.DS.'tcpdf'.DS.'config'.DS.'lang'.DS.'eng.php';
    require_once JPATH_LIBRARIES.DS.'tcpdf'.DS.'tcpdf.php';
    Все это так. но лично у меня из этого ХОРОШЕГО ПОЛУЧИЛОСЬ МАЛО и я вместо этого сделат так:

    jimport('tcpdf.config.lang.eng');
    jimport('tcpdf.tcpdf');

    // Создаем новый PDF документ
    $pdf = new TCPDF();
    // Заполняем свойства файла, если надо. Это все то, что будет отображено в свойствах файла
    $pdf->SetCreator('Создатель');
    $pdf->SetAuthor('Автор');
    $pdf->SetTitle('название файла не имя файла');
    $pdf->SetSubject('Что это за файл такой о чем он');
    $pdf->SetKeywords("Ключевые слова через запятую");

    //Далее можно установитьсвойства Заголовка
    $address = "";
    $phone = "";
    $fax = "";
    $pdf->setHeaderData('your company logo', 25, 'company name', $address.$phone.$fax);
    $pdf->setHeaderFont(array('freesans', '', 8));
    $pdf->setFooterFont(array('freesans', '', 6));
    $pdf->setHeaderMargin(5);
    $pdf->setFooterMargin(5);
    $pdf->SetMargins(15,35,-1);

    ... Но ЗАГОЛОВОК и ПОДНОЖИЕ - это как-раз то, от чего мне надо было избавиться и я сделл так:

    //false = Не отображать Заголовок Ну и тоже самое с Подножием (Footer)
    $pdf
    ->setPrintHeader(false);
    $pdf->setPrintFooter(false);

    //Назначим шрифт по умолчанию. К стати он единственный в пакете Joomla для этой библиотеки. Надо больше? Добавляйте свои.
    $pdf->SetFont('freesans', '',10);

    // Создадим страницу и для нее шрифт
    $pdf->AddPage();
    $pdf->SetFont('freesans', '',9);

    //Создадим контент для PDF
    //Cell('Width', 'Height', 'Content', 'Border', 'Line', 'Cell Align', 'Fill', 'Link', 'Stretch')
    $pdf->Cell(0, 10, 'TEST CELL STRETCH: no stretch', 0, 1, 'C', 0, '', 0);
    $pdf->Cell( 40, 4, 'Вітаю', 0, 0, 'С', 0, 1);
    $pdf->Cell( 60, 4, 'Вам', 1, 10, 'L', 0, 1);
    $pdf->Cell( 10, 4, 'Всем', 1, 10, 'L', 0, 1);
    $pdf->Cell( 10, 4, 'От', 1, 10, 'L', 0, 1);
    $pdf->Cell( 40, 4, 'Меня', 1, 10, 'L', 0, 1);
    $pdf->ln();//Новая строка

    $pdf->SetTextColor(0,0,0); //set text colour
    $pdf->SetLineWidth(.1);

    $pdf->Output('mypdf.pdf', 'I');
    exit;
    }

    Ну вот и все, теперь вы можете полностью реализовать возможности библиотеки TCPDF. Конечно я тут привел примитивный пример. Если вам необходимо больше - Вам надо ознакомиться с Примерами на официальном сайте разработчика TCPDF.

    Если я что то изложио не так, ну или вообще исказил реальность, участники меня поправят.
    Всем Благодарю и успехов Вам побольше !!!
     
    Последнее редактирование: 31.10.2009
  4. infoman
    Offline

    infoman Недавно здесь

    Регистрация:
    28.08.2007
    Сообщения:
    575
    Симпатии:
    12
    Пол:
    Мужской
    Привет форуму жумлы и его жумловодам. сто лет тут не был вот вернулся чтобы постнуть ибо столкнулся с той же фигнёй что и автор. но у меня ситуация другая и сделал я всё гораздо проще:

    компонент mtree нужно сделать так чтобы кнопка распечатать выводила пдф а на хтмл
    всё что я сделал это добавил в строку запроса просмотра деталей записи в каталоге - com_mtree&task=viewlink&link_id=***&format=pdf

    как результат получил ошибку addcostomtag но это я решил обычным способом - закомментил "///" эти костомтаги и обновил страничку и о чудо я получил ПДФ )) конечно все хтмл теги вышли в виде текста и пдф не смог их обработать и выкинул как есть но я думаю что почистить их для итоговой формы распечатки несложно. кстати колонтитулов вообще никаких нет .
    точнее они есть в виде номера страницы, и верхний колонтитул это название объекта в каталоге mtree но это тоже можно подправить....

    вот как то так. ещё раз привет всем кого давно не видел :D
     

Поделиться этой страницей

Загрузка...