|
 11.2 Кб |
|
| Здравствуйте. Может тема и не php, а html, думаю, Вы мне поможите найти решение.
Есть форма (во вложении), есть данные полученные от пользователя. Как вписать эти данные в эту картинку? Все это надо выводить пользователю на экран, чтобы он смог это распечатать.
пытался сделать уже двумя вариантами:
Вариант 1: на php открывал картинку и писал текст
<?
$src = imagecreatefromjpeg('form_ppm.jpg');
$textcolor=imagecolorallocate($src,0,0,0);
imagettftext($src, 12, 0, 160, 137, $textcolor, "arial.ttf", "МАМИН-СИБИРЯК");
header("Content-type: image/jpeg");
ImageJpeg($src, null, -1);
|
Но шрифт не попадает в клетке (первая буква в первой клетке, а последующии буквы вообще никак не попадают в клетки). Как увеличить расстояние между буквами?
Вариант 2: на html и css. Картинку делал фоном и поверх нее писал текст.
<?
<html>
<body style="background-image:url(form_ppm.jpg); background-repeat: no-repeat;">
<div style="position: absolute; left:165px; top:123px; font: 12pt Courier New; letter-spacing: 8pt; ">НИКОЛАЕВ</div>
<div style="position: absolute; left:165px; top:146px; font: 12pt Courier New; letter-spacing: 8pt; ">ПЕТР</div>
<div style="position: absolute; left:165px; top:169px; font: 12pt Courier New; letter-spacing: 8pt; ">СЕРГЕЕВИЧ</div>
<div style="position: absolute; left:560px; top:146px; font: 12pt Courier New; letter-spacing: 8pt; ">М</div>
</body>
</html>
|
Тут letter-spacing: 8pt; отлично решил проблему с попаданиями в клетки, Но при распечатке фон не распечатывается. | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 19:47)
| | А не лучше эти таблички сделать при помощи HTML+CSS? Понимаю, что это изрядная работа, но люди даже почтовые квитанции при помощи CSS воспроизводят... Зато у вас не поползет бланк из-за того, что у пользователя нет шрифта или он увеличил масштаб. Или как вариант формировать динамический PDF-файл - этот вообще гарантирует неизменность вида для печати, да и сохранить его можно. | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 20:13)
| | про pdf расскажите, пожалуйста, поподробнее | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 20:16)
| | Есть расширение PHP, которое позволяет формировать PDF-файлы динамически. Раньше оно было бесплатным, сейчас не поймешь, то ли платное, то ли как... В любом случае потребуется либо сервер, либо хостинг, на котором это расширение установлено. Если это не проблема PDF предоставляет широкие возможности для качественной подготовки печатной информации, которая гарантировано выглядит одинаково на любых операционных системах и платформах. Этот формат даже типографии и издательства используют, а сделать при помощи PDF можно практически все, более того, можно в качестве основы взять Word-документ, перегнать его в PDF и работать с этим шаблоном, заполняя его каждый раз в зависимости от результатов (зато уж если вы указали где выводить данные - они там и выведутся, никуда не смещаясь). | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 20:24)
| | мне как раз изначально эту форму в pdf и прислали) поищю библиотеки...жалко что так сложно... через jpg было бы проще) | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 20:27)
| | Ну и через JPEG можно, только с буквами работайте по отдельности. | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 20:27)
| |
<?
imagettftext($src, 12, 0, 160, 137, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", "Маммин-Сибиряк");
|
Выводит кирилицу
<?
$arr1 = str_split("Мамин-Сибиряк");
foreach ($arr1 as $key => $value)
{
imagettftext($src, 12, 0, (160+$key*10), 137, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", "$value");
}
|
почему то выводит иероглифы | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 20:49)
| | В UTF-8 работаете? | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 21:12)
| | cheops, да
<?
foreach (str_split("Мамин сибиряк") as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/arial.ttf", $value."мама");
}
|
"мама" выводит как надо, а $value - иероглифами | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 21:16)
| | вот такой вариант работает:
<?
foreach (str_split(iconv('UTF-8', 'WINDOWS-1251', "Мамин-Сибиряк")) as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", iconv('WINDOWS-1251', 'UTF-8', $value));
}
|
неужели проще нельзя?! | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 21:38)
| | счас ругаться буду!!!!!!
<?
$text= strtoupper("Мамин-Сибиряк");
foreach (str_split(iconv('UTF-8', 'WINDOWS-1251', $text)) as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", iconv('WINDOWS-1251', 'UTF-8', $value));
} // выводит Мамин-Сибиряк
// пробовал разные варианты
$text= "Мамин-Сибиряк";
foreach (str_split(strtoupper(iconv('UTF-8', 'WINDOWS-1251', $text))) as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", iconv('WINDOWS-1251', 'UTF-8', $value));
} // выводит Мамин-Сибиряк
$text= "Мамин-Сибиряк";
foreach (str_split(iconv('UTF-8', 'WINDOWS-1251', $text)) as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", strtoupper(iconv('WINDOWS-1251', 'UTF-8', $value)));
} // выводит Мамин-Сибиряк
$text= "Мамин-Сибиряк";
foreach (str_split(iconv('UTF-8', 'WINDOWS-1251', $text)) as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", iconv('WINDOWS-1251', 'UTF-8', strtoupper($value)));
} // выводит Мамин-Сибиряк
---------------
foreach (str_split(strtoupper("Mamin-Sibiruyak")) as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 160, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", $value);
} // вывоит MAMIN-SIBIRYAK
|
почему в первом случае буквы не становятся прописными??? | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 21:38)
| | Еще больше не понятно:(
<?
$text= strtoupper("Mamin");
foreach (str_split(iconv('UTF-8', 'WINDOWS-1251', $text)) as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", iconv('WINDOWS-1251', 'UTF-8', $value));
} //Выводит MAMIN
|
| |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 22:02)
| | Для начала, функции strtoupper() и str_split() не поддерживают UTF-8, для работы с этими строками необходимо использовать функции расширения mb_string. | |
|
|
|
|
|
|
|
для: cheops
(04.04.2011 в 00:03)
| | хм...а какой шаблон должен быть в mb_split для разбивки побуквенно? | |
|
|
|
|
|
|
|
для: P@Sol
(04.04.2011 в 09:33)
| | mb_split() нужно пожертвовать какой-то символ строки, который будет служить разделителем. Лучше написать свою собственную функцию разбивки, как-то так
<?php
$text = "Привет мир!";
$arr = eachletter($text);
echo "<pre>";
print_r($arr);
echo "</pre>";
function eachletter($text, $codepage = "UTF-8")
{
$arr = array();
for($i = 0; $i < mb_strlen($text, $codepage); $i++)
{
$arr[$i] = mb_substr($text, $i, 1, $codepage);
}
return $arr;
}
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(04.04.2011 в 11:00)
| | м-да, уж! как все просто | |
|
|
|
|
|
|
|
для: cheops
(04.04.2011 в 11:00)
| | Итог темы:
<?
function eachletter($text, $codepage = "UTF-8")
{
$arr = array();
for($i = 0; $i < mb_strlen($text, $codepage); $i++)
{
$arr[$i] = mb_substr($text, $i, 1, $codepage);
}
return $arr;
}
$src = imagecreatefromjpeg($_SERVER['DOCUMENT_ROOT'].'/image/form.jpg');
$textcolor=imagecolorallocate($src,0,0,0);
foreach (eachletter(mb_strtoupper("Мамин-Сибиряк",'UTF-8')) as $key => $value)
{
imagettftext($src, 10, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", $value);
}
foreach (eachletter(mb_strtoupper("Дмитрий",'UTF-8')) as $key => $value)
{
imagettftext($src, 10, 0, (165+$key*21), 160, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", $value);
}
foreach (eachletter(mb_strtoupper("Наркисович",'UTF-8')) as $key => $value)
{
imagettftext($src, 10, 0, (165+$key*21), 183, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", $value);
}
header("Content-type: image/jpeg");
ImageJpeg($src, null, -1);
ImageDestroy($src);
|
| |
|
|
|
|
|
|
|
для: P@Sol
(04.04.2011 в 21:49)
| | разместил этот код на двух сайтах на одном хостинге с одинаковыми настройками. на одном работает, на втором отображается квадратик с красным крестиком. в чем может быть проблема? | |
|
|
|
|
|
|
|
для: P@Sol
(19.04.2011 в 20:33)
| | Квадрат какого размера (хоть что-то на странице приблизительно имеет такие же размеры)? | |
|
|
|
|
|
|
|
для: cheops
(19.04.2011 в 20:35)
| | квадрат, обычный, который показывает, что отсутствует изображение | |
|
|
|
|
|
|
|
для: P@Sol
(19.04.2011 в 20:57)
| | А, речь об тэге <img>? Посмотрите что выводит сам скрипт, набрав его в адресной строке. | |
|
|
|
|
|
|
|
для: cheops
(19.04.2011 в 21:24)
| | итог работы скрипта вывод изображения:
header("Content-type: image/jpeg");
ImageJpeg($src, null, -1);
т.е. я в обоих случаях набираю /card.php?number=33303431353336
в первом выводится форма, во втором этот самый квадратик.
содержание card.php - то, что в посте Итог темы: | |
|
|
|
|
|
|
|
для: P@Sol
(19.04.2011 в 21:39)
| | Временно закомментируйте header("Content-type: image/jpeg"); - он может скрывать вывод об ошибке. | |
|
|
|
|
|
|
|
для: cheops
(19.04.2011 в 21:53)
| | делал - ничего не выводится.
данные берутся из бд. выводил их print_r - все на месте. картинка-фон, на месте, шрифт - на месте. | |
|
|
|
|
|
|
|
для: cheops
(19.04.2011 в 21:53)
| | кажется нашел ошибку...странно пока...закомментировал вызов данныз из бд - картинка появилась. счас буду дальлше разбираться | |
|
|
|
|
|
|
|
для: cheops
(04.04.2011 в 00:03)
| | а почему этот вариант не работает? я же в win перевожу?
<?
foreach (str_split(strtoupper(iconv('UTF-8', 'WINDOWS-1251', $text))) as $key => $value)
{
imagettftext($src, 11, 0, (165+$key*21), 138, $textcolor, $_SERVER['DOCUMENT_ROOT']."/font/arial.ttf", iconv('WINDOWS-1251', 'UTF-8', $value));
} // выводит Мамин-Сибиряк
|
| |
|
|
|
|
|
|
|
для: P@Sol
(04.04.2011 в 21:07)
| | А str_split() что возвращает? Вы дамп массива контролировали? Вообще говоря это избыточная функция в однобайтовой кодировке со строкой можно работать как с массивом. | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 19:47)
| | 1. В первом варианте каждую букву выводите отдельно - иначе никак. | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 20:25)
| | а если разбивать слово посимвольно и вставлять пробелы? не видели такого кода? | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 20:28)
| | Длина пробела от шрифта и размера зависит, не получится хорошо прицелится и разместить буквы - криво получится (одна буква у левой границы, другая у правой). Лучше сразу посимвольно работать. | |
|
|
|
|
|
|
|
для: cheops
(03.04.2011 в 20:32)
| | а если шрифт моноширинный взять - нет?!
т.е. считать все символы в массив и выводить допустим через каждые 10px? попробую | |
|
|
|
|
|
|
|
для: P@Sol
(03.04.2011 в 20:34)
| | Можно, но ширина букв не обязательно будет кратна ширине ячеек. В принципе можно так поступать, использовать моноширинный шрифт и под него подгонять размер изображения подложки. | |
|
|
|
|