Санкт-Петербург

+7 904 602 4546

nataris@list.ru

Nataris Studio >>

Тема: Счет-квитанция pdf

Подключаемся к смс

Смс с сайта по 15 коп.

CSS-памятки

товары раздела
Делаем счет-квитанцию в формате PDF средствами PHP на стороне сервера

Инструмент "Счет-квитанция" требуется в интернет-магазине, есть рекомендация по защите от хакеров, не забывайте, что всякие счета, номера яндекс и веб-мани денег являются лакомым кусочком для хакеров, они всегда будут стремиться подсунуть на вашу страницу свои данные, и деньги будут уходить в другое место. Поэтому, рекомендация не давать ссылок на страницу счёт-квитанции, лучше если эта страница будет доступна только для админа, который проверив счёт вышлет файл на нужный мэйл.

Теперь перейдём к технической части.

Для поддержки формата PDF средствами php нам понадобится библиотека, вернее php класс TCPDF http://www.tcpdf.org/ Это очень мощный инструмент, скачивайте последнюю версию и изучайте класс, он хоть и на английском, достаточно подробно описан тут: http://www.tcpdf.org/doc/code/annotated.html

                            

Теперь посмотрим реализацию нашей квитанции. Пример приведён для кодировки CP1251, для UTF-8 все преобразования iconv будут лишние.

require_once(dirname(__FILE__).'/tcpdf/config/lang/rus.php');

require_once(dirname(__FILE__).'/tcpdf/tcpdf.php'); 
class MYPDF_C extends TCPDF
{ 
    //Page header 
    public function Header()
    { 
    } 
    // Page footer 
    public function Footer()
    { 
    } 
} 
// create new PDF document 
$pdf = new MYPDF_C(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false); 

// --------------------------------------------------------- 

$pdf->AddPage();
$pdf->setFontStretching(105);
$pdf->SetFont('freesans', 'B', 9);
$pdf->Text(20, 22, iconv("WINDOWS-1251","UTF-8", 'Извещение' ));
$pdf->Text(23, 81, iconv("WINDOWS-1251","UTF-8", 'Кассир' )); 
$pdf->Text(20, 142, iconv("WINDOWS-1251","UTF-8", 'Квитанция' )); 
$pdf->Text(23, 151, iconv("WINDOWS-1251","UTF-8", 'Кассир' ));

$pdf->SetFont('freesans', 'B', 8);
$pdf->Text(54, 22, iconv("WINDOWS-1251","UTF-8", 'СБЕРБАНК РОССИИ' ));
$pdf->SetFont('freesans', '', 5);
$pdf->Text(54, 26, iconv("WINDOWS-1251","UTF-8", 'Основан в 1841 году' ));

$pdf->SetFont('freesans', 'I', 5);
$pdf->Text(178.5, 23, iconv("WINDOWS-1251","UTF-8", 'Форма № ПД-4' ));

$pdf->SetDrawColor(0);
$pdf->SetLineWidth(0.3);

$pdf->Line(9,20,197,20);
$pdf->Line(197,20,197,160);
$pdf->Line(9,20,9,160);
$pdf->Line(9,160,197,160);
$pdf->Line(9,90,197,90);
$pdf->Line(50.7,20,50.7,160);

$pdf->Line(55,$s+26,87,$s+26);

//для двух проходов: нижнего и верхнего
$s_arr = array(-0.5, 70);
foreach($s_arr as $s)
{
//Линии
$pdf->Line(55,$s+32,192,$s+32);


$pdf->Line(55,$s+35,103,$s+35);
$pdf->Line(55,$s+39,103,$s+39);

$a=55;
for($i=0; $i<13; $i++)
{
    $pdf->Line($a,$s+35,$a,$s+39);
    $a = $a+4;
}

$pdf->Line(112,$s+35,192,$s+35);
$pdf->Line(112,$s+39,192,$s+39);

$a=192;
for($i=0; $i<21; $i++)
{
    $pdf->Line($a,$s+35,$a,$s+39);
    $a = $a-4;
}

$pdf->Line(156,$s+42,192,$s+42);
$pdf->Line(156,$s+46,192,$s+46);
$pdf->Line(60,$s+46,144,$s+46);

$a=192;
for($i=0; $i<10; $i++)
{
    $pdf->Line($a,$s+42,$a,$s+46);
    $a = $a-4;
}

$pdf->Line(112,$s+47,192,$s+47);
$pdf->Line(112,$s+51,192,$s+51);

$a=192;
for($i=0; $i<21; $i++)
{
    $pdf->Line($a,$s+47,$a,$s+51);
    $a = $a-4;
}

$pdf->Line(55,$s+55,128,$s+55);
$pdf->Line(136,$s+55,192,$s+55);

$pdf->Line(88,$s+62,192,$s+62);
$pdf->Line(88,$s+67,192,$s+67);

$pdf->Line(80,$s+73,95,$s+73);
$pdf->Line(103,$s+73,110,$s+73);

$pdf->Line(164,$s+73,173,$s+73);
$pdf->Line(180,$s+73,185,$s+73);

$pdf->Line(66,$s+78,81,$s+78);
$pdf->Line(89,$s+78,96,$s+78);
$pdf->Line(140,$s+78,148,$s+78);
$pdf->Line(151,$s+78,180,$s+78);
$pdf->Line(186,$s+78,189,$s+78);
$pdf->Line(150,$s+88.6,192,$s+88.6);

//ТЕКСТЫ
$pdf->SetFont('freesans', '', 6);

$pdf->Text(104, $s+32, iconv("WINDOWS-1251","UTF-8", '(наименование получателя платежа)' ));

$pdf->SetFont('freesans', '', 6);
$pdf->Text(65, $s+39, iconv("WINDOWS-1251","UTF-8", '(ИНН получателя платежа)' ));
$pdf->Text(135, $s+39, iconv("WINDOWS-1251","UTF-8", '(номер счета получателя платежа)' ));

$pdf->SetFont('freesans', '', 8);

$pdf->Text(148, $s+42.5, iconv("WINDOWS-1251","UTF-8", 'БИК' ));

$pdf->SetFont('freesans', '', 7);
$pdf->Text(55, $s+47, iconv("WINDOWS-1251","UTF-8", 'Номер кор./сч.банка получателя платежа' ));

$pdf->SetFont('freesans', 'B', 9);
$pdf->Text(65, $s+51, iconv("WINDOWS-1251","UTF-8", 'оплата за товар' ));

$pdf->SetFont('freesans', '', 6);
$pdf->Text(80, $s+55, iconv("WINDOWS-1251","UTF-8", '(наименование платежа)' ));
$pdf->Text(141, $s+55, iconv("WINDOWS-1251","UTF-8", '(номер лицевого счета (код) плательщика)' ));

$pdf->SetFont('freesans', '', 8);
$pdf->Text(55, $s+59, iconv("WINDOWS-1251","UTF-8", 'Ф.И.О. Плательщика' ));

$pdf->SetFont('freesans', '', 8);
$pdf->Text(55, $s+64, iconv("WINDOWS-1251","UTF-8", 'Адрес плательщика' ));

$pdf->SetFont('freesans', '', 8);
$pdf->Text(55, $s+70, iconv("WINDOWS-1251","UTF-8", 'Сумма платежа' ));
$pdf->Text(96, $s+70, iconv("WINDOWS-1251","UTF-8", 'руб.' ));
$pdf->Text(110, $s+70, iconv("WINDOWS-1251","UTF-8", 'коп.' ));

$pdf->Text(130, $s+70, iconv("WINDOWS-1251","UTF-8", 'Сумма платы за услуги' ));

$pdf->Text(173, $s+70, iconv("WINDOWS-1251","UTF-8", 'руб.' ));
$pdf->Text(185, $s+70, iconv("WINDOWS-1251","UTF-8", 'коп.' ));
$pdf->Text(55, $s+75, iconv("WINDOWS-1251","UTF-8", 'Итого' ));
$pdf->Text(82, $s+75, iconv("WINDOWS-1251","UTF-8", 'руб.' ));
$pdf->Text(96, $s+75, iconv("WINDOWS-1251","UTF-8", 'коп.' ));
$pdf->Text(138, $s+75, iconv("WINDOWS-1251","UTF-8", '"' ));
$pdf->Text(147, $s+75, iconv("WINDOWS-1251","UTF-8", '"' ));
$pdf->Text(180, $s+75, iconv("WINDOWS-1251","UTF-8", '201' ));
$pdf->Text(189, $s+75, iconv("WINDOWS-1251","UTF-8", 'г.' ));

$pdf->SetFont('freesans', '', 6);
$pdf->Text(55, $s+80, iconv("WINDOWS-1251","UTF-8", 'С условиями приема указанной в платежном документе суммы, в т.ч. с суммой взимаемой платы за услуги' ));
$pdf->Text(55, $s+83, iconv("WINDOWS-1251","UTF-8", 'банка, ознакомлен и согласен' ));

$pdf->SetFont('freesans', 'B', 7);
$pdf->Text(119, $s+85, iconv("WINDOWS-1251","UTF-8", 'Подпись плательщика' ));

//Заполняем данные предприятия

$pdf->SetFont('freesans', '', 10);
$pdf->Text(61, $s+28, iconv("WINDOWS-1251","UTF-8", 'Индивидуальный предприниматель Кукареков Николай Владимирович' ));

//Банк

$pdf->SetFont('freesans', '', 7);
$pdf->Text(55, $s+42.5, iconv("WINDOWS-1251","UTF-8", 'в' ));
$pdf->Text(59, $s+42.5, iconv("WINDOWS-1251","UTF-8", 'Северо-Западный банк ОАО "Сбербанк России"  г.Санкт-Петербург' ));

//Заполняем данные клиента

$fio = "Иванов Иван Иванович";

$summa_rub = "20555";

$summa_kop = "20";

$id_order = 298777;

$pdf->SetFont('freesans', 'B', 10);

//ИНН получателя платежа (12-значный)

$a=55;
$arr = array(4,8,2,0,0,1,5,6,8,0,1,1);
for($i=0; $i<12; $i++)
{
    $pdf->Text($a, $s+34.8, $arr[$i]);
    $a = $a + 4;
}

//номер счета получателя платежа (20-значный)

$a=112;
$arr = array(4,0,8,0,2,8,1,0,2,5,5,1,4,0,0,0,0,5,7,7);
for($i=0; $i<20; $i++)
{
    $pdf->Text($a, $s+34.8, $arr[$i]);
    $a = $a + 4;
}

//БИК (9-значный)

$a=156;
$arr = array(0,4,4,0,3,0,6,5,3);
for($i=0; $i<9; $i++)
{
    $pdf->Text($a, $s+42, $arr[$i]);
    $a = $a + 4;
}

//Номер кор./сч.банка получателя платежа (20-значный)

$a=112;
$arr = array(3,0,1,0,1,8,1,0,5,0,0,0,0,0,0,0,0,6,5,3);
for($i=0; $i<20; $i++)
{
    $pdf->Text($a, $s+46.7, $arr[$i]);
    $a = $a + 4;
}

$pdf->SetFont('freesans', '', 10);

$pdf->Text(88, $s+58, iconv("WINDOWS-1251","UTF-8", $fio));
$pdf->Text(80, $s+69, iconv("WINDOWS-1251","UTF-8", $summa_rub));
$pdf->Text(103.5, $s+69, iconv("WINDOWS-1251","UTF-8", $summa_kop));
}

//Создаем реальный файл PDF с именем клиента и номером заказа

//Папка, в которую пишем, должна иметь доступ 777

$fio_utf = iconv("CP1251", "UTF-8", $fio);
$pdf->Output($_SERVER['DOCUMENT_ROOT']."/pdf/kvit/".$fio_utf.' '.$id_order.".pdf", "F");

//И открываем его в текущем окне

$URL='http://'.$_SERVER['HTTP_HOST'].'/pdf/kvit/'.$fio_utf.' '.$id_order.'.pdf';
header ("Location: $URL");

 

Если вы не хотите создавать реальный файл, в функции Output ставьте "I", тогда произойдет вывод файла в броузер, единственное, чем плох этот метод, вы не сможете давать имя файла русскими буквами, во всяком случае у меня не получилось.

 

Комментарии:
19.06.2017
Алексей
adfadfadfasf
21.02.2018
Андрей
Такой вопрос, а как вывести форму с полями, где пользователь указывает свои данные, ФИО, ИНН и прочее? Благодарю
23.02.2018
Админ
Андрей, если я поняла, вам нужна форма, типа такой: http://nataris.ru/person.html Посмотрите код страницы, он небольшой.

Ваше имя:

Ваш комментарий:

Давай дружить

Принимаем


Наверх