Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Вписать текст в форму
 
 автор: P@Sol   (03.04.2011 в 19:47)   письмо автору
11.2 Кб
 
 

Здравствуйте. Может тема и не php, а html, думаю, Вы мне поможите найти решение.

Есть форма (во вложении), есть данные полученные от пользователя. Как вписать эти данные в эту картинку? Все это надо выводить пользователю на экран, чтобы он смог это распечатать.

пытался сделать уже двумя вариантами:

Вариант 1: на php открывал картинку и писал текст
<?
$src 
imagecreatefromjpeg('form_ppm.jpg');
$textcolor=imagecolorallocate($src,0,0,0);
imagettftext($src120160137$textcolor"arial.ttf""МАМИН-СИБИРЯК");
header("Content-type: image/jpeg");
ImageJpeg($srcnull, -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; отлично решил проблему с попаданиями в клетки, Но при распечатке фон не распечатывается.

  Ответить  
 
 автор: cheops   (03.04.2011 в 20:13)   письмо автору
 
   для: P@Sol   (03.04.2011 в 19:47)
 

А не лучше эти таблички сделать при помощи HTML+CSS? Понимаю, что это изрядная работа, но люди даже почтовые квитанции при помощи CSS воспроизводят... Зато у вас не поползет бланк из-за того, что у пользователя нет шрифта или он увеличил масштаб. Или как вариант формировать динамический PDF-файл - этот вообще гарантирует неизменность вида для печати, да и сохранить его можно.

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 20:16)   письмо автору
 
   для: cheops   (03.04.2011 в 20:13)
 

про pdf расскажите, пожалуйста, поподробнее

  Ответить  
 
 автор: cheops   (03.04.2011 в 20:24)   письмо автору
 
   для: P@Sol   (03.04.2011 в 20:16)
 

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

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 20:27)   письмо автору
 
   для: cheops   (03.04.2011 в 20:24)
 

мне как раз изначально эту форму в pdf и прислали) поищю библиотеки...жалко что так сложно... через jpg было бы проще)

  Ответить  
 
 автор: cheops   (03.04.2011 в 20:27)   письмо автору
 
   для: P@Sol   (03.04.2011 в 20:27)
 

Ну и через JPEG можно, только с буквами работайте по отдельности.

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 20:49)   письмо автору
 
   для: cheops   (03.04.2011 в 20:27)
 

<?
imagettftext
($src120160137$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf""Маммин-Сибиряк");

Выводит кирилицу

<?
$arr1 
str_split("Мамин-Сибиряк");
foreach (
$arr1 as $key => $value)
  {
      
imagettftext($src120, (160+$key*10), 137$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf""$value");
  }

почему то выводит иероглифы

  Ответить  
 
 автор: cheops   (03.04.2011 в 21:12)   письмо автору
 
   для: P@Sol   (03.04.2011 в 20:49)
 

В UTF-8 работаете?

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 21:16)   письмо автору
 
   для: cheops   (03.04.2011 в 21:12)
 

cheops, да

<?
foreach (str_split("Мамин сибиряк") as $key => $value)
  {
      
imagettftext($src110, (165+$key*21), 138$textcolor$_SERVER['DOCUMENT_ROOT']."/arial.ttf"$value."мама");
  }


"мама" выводит как надо, а $value - иероглифами

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 21:38)   письмо автору
 
   для: P@Sol   (03.04.2011 в 21:16)
 

вот такой вариант работает:

<?
foreach (str_split(iconv('UTF-8''WINDOWS-1251'"Мамин-Сибиряк")) as $key => $value)
  {
      
imagettftext($src110, (165+$key*21), 138$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf"iconv('WINDOWS-1251''UTF-8'$value));
  }


неужели проще нельзя?!

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 21:46)   письмо автору
 
   для: P@Sol   (03.04.2011 в 21:38)
 

счас ругаться буду!!!!!!

<?
$text
strtoupper("Мамин-Сибиряк");
foreach (
str_split(iconv('UTF-8''WINDOWS-1251'$text)) as $key => $value)
  {
      
imagettftext($src110, (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($src110, (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($src110, (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($src110, (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($src110, (165+$key*21), 160$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf"$value);
  } 
// вывоит MAMIN-SIBIRYAK


почему в первом случае буквы не становятся прописными???

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 22:02)   письмо автору
 
   для: P@Sol   (03.04.2011 в 21:38)
 

Еще больше не понятно:(

<?
$text
strtoupper("Mamin");
foreach (
str_split(iconv('UTF-8''WINDOWS-1251'$text)) as $key => $value)
  {
      
imagettftext($src110, (165+$key*21), 138$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf"iconv('WINDOWS-1251''UTF-8'$value));
  } 
//Выводит MAMIN

  Ответить  
 
 автор: cheops   (04.04.2011 в 00:03)   письмо автору
 
   для: P@Sol   (03.04.2011 в 22:02)
 

Для начала, функции strtoupper() и str_split() не поддерживают UTF-8, для работы с этими строками необходимо использовать функции расширения mb_string.

  Ответить  
 
 автор: P@Sol   (04.04.2011 в 09:33)   письмо автору
 
   для: cheops   (04.04.2011 в 00:03)
 

хм...а какой шаблон должен быть в mb_split для разбивки побуквенно?

  Ответить  
 
 автор: cheops   (04.04.2011 в 11:00)   письмо автору
 
   для: 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$i1$codepage);
    }
    return 
$arr;
  }
?>

  Ответить  
 
 автор: P@Sol   (04.04.2011 в 11:08)   письмо автору
 
   для: cheops   (04.04.2011 в 11:00)
 

м-да, уж! как все просто

  Ответить  
 
 автор: P@Sol   (04.04.2011 в 21:49)   письмо автору
 
   для: 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$i1$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($src100, (165+$key*21), 138$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf"$value);
  }

foreach (
eachletter(mb_strtoupper("Дмитрий",'UTF-8')) as $key => $value)
  {
      
imagettftext($src100, (165+$key*21), 160$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf"$value);
  }

foreach (
eachletter(mb_strtoupper("Наркисович",'UTF-8')) as $key => $value)
  {
      
imagettftext($src100, (165+$key*21), 183$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf"$value);
  }

header("Content-type: image/jpeg");
ImageJpeg($srcnull, -1);
ImageDestroy($src);

  Ответить  
 
 автор: P@Sol   (19.04.2011 в 20:33)   письмо автору
 
   для: P@Sol   (04.04.2011 в 21:49)
 

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

  Ответить  
 
 автор: cheops   (19.04.2011 в 20:35)   письмо автору
 
   для: P@Sol   (19.04.2011 в 20:33)
 

Квадрат какого размера (хоть что-то на странице приблизительно имеет такие же размеры)?

  Ответить  
 
 автор: P@Sol   (19.04.2011 в 20:57)   письмо автору
 
   для: cheops   (19.04.2011 в 20:35)
 

квадрат, обычный, который показывает, что отсутствует изображение

  Ответить  
 
 автор: cheops   (19.04.2011 в 21:24)   письмо автору
 
   для: P@Sol   (19.04.2011 в 20:57)
 

А, речь об тэге <img>? Посмотрите что выводит сам скрипт, набрав его в адресной строке.

  Ответить  
 
 автор: P@Sol   (19.04.2011 в 21:39)   письмо автору
 
   для: cheops   (19.04.2011 в 21:24)
 

итог работы скрипта вывод изображения:
header("Content-type: image/jpeg");
ImageJpeg($src, null, -1);


т.е. я в обоих случаях набираю /card.php?number=33303431353336
в первом выводится форма, во втором этот самый квадратик.

содержание card.php - то, что в посте Итог темы:

  Ответить  
 
 автор: cheops   (19.04.2011 в 21:53)   письмо автору
 
   для: P@Sol   (19.04.2011 в 21:39)
 

Временно закомментируйте header("Content-type: image/jpeg"); - он может скрывать вывод об ошибке.

  Ответить  
 
 автор: P@Sol   (19.04.2011 в 22:01)   письмо автору
 
   для: cheops   (19.04.2011 в 21:53)
 

делал - ничего не выводится.

данные берутся из бд. выводил их print_r - все на месте. картинка-фон, на месте, шрифт - на месте.

  Ответить  
 
 автор: P@Sol   (19.04.2011 в 22:15)   письмо автору
 
   для: cheops   (19.04.2011 в 21:53)
 

кажется нашел ошибку...странно пока...закомментировал вызов данныз из бд - картинка появилась. счас буду дальлше разбираться

  Ответить  
 
 автор: P@Sol   (04.04.2011 в 21:07)   письмо автору
 
   для: cheops   (04.04.2011 в 00:03)
 

а почему этот вариант не работает? я же в win перевожу?
<?
foreach (str_split(strtoupper(iconv('UTF-8''WINDOWS-1251'$text))) as $key => $value
  { 
      
imagettftext($src110, (165+$key*21), 138$textcolor$_SERVER['DOCUMENT_ROOT']."/font/arial.ttf"iconv('WINDOWS-1251''UTF-8'$value)); 
  } 
// выводит Мамин-Сибиряк

  Ответить  
 
 автор: cheops   (04.04.2011 в 22:08)   письмо автору
 
   для: P@Sol   (04.04.2011 в 21:07)
 

А str_split() что возвращает? Вы дамп массива контролировали? Вообще говоря это избыточная функция в однобайтовой кодировке со строкой можно работать как с массивом.

  Ответить  
 
 автор: cheops   (03.04.2011 в 20:25)   письмо автору
 
   для: P@Sol   (03.04.2011 в 19:47)
 

1. В первом варианте каждую букву выводите отдельно - иначе никак.

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 20:28)   письмо автору
 
   для: cheops   (03.04.2011 в 20:25)
 

а если разбивать слово посимвольно и вставлять пробелы? не видели такого кода?

  Ответить  
 
 автор: cheops   (03.04.2011 в 20:32)   письмо автору
 
   для: P@Sol   (03.04.2011 в 20:28)
 

Длина пробела от шрифта и размера зависит, не получится хорошо прицелится и разместить буквы - криво получится (одна буква у левой границы, другая у правой). Лучше сразу посимвольно работать.

  Ответить  
 
 автор: P@Sol   (03.04.2011 в 20:34)   письмо автору
 
   для: cheops   (03.04.2011 в 20:32)
 

а если шрифт моноширинный взять - нет?!

т.е. считать все символы в массив и выводить допустим через каждые 10px? попробую

  Ответить  
 
 автор: cheops   (03.04.2011 в 20:38)   письмо автору
 
   для: P@Sol   (03.04.2011 в 20:34)
 

Можно, но ширина букв не обязательно будет кратна ширине ячеек. В принципе можно так поступать, использовать моноширинный шрифт и под него подгонять размер изображения подложки.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования