Avatar billede kodak Mester
21. august 2010 - 15:41 Der er 25 kommentarer og
1 løsning

Printer linieskift

Jeg har følgendene script som jeg gerne skulle have til at skifte linie efter x antal tegn

Vi har kikket på opgaven et længere stykke tid og er ind til vidre kommet frem til følgendene script:
<?php
$opgave_navn = "SMS Print";      // navnet du vil kunne se på dokumentet i udskrift listen
$printer = "\\\\192.168.100.3\\HP Color LaserJet 2600n"; // kilden til printeren
$user = $_GET["user"];            // brugernavn bliver modtaget
$password = $_GET["password"];    //password bliver modtaget
$text = "Til " . $_GET["user"] . "<br>" . $_GET["text"] . ""; // Bruger og tekst bliver modtaget
$api_id = $_GET["api_id"];        // id bliver modtaget
$to = $_GET["to"];                // modtagerens mobilnummer bliver modtaget
$fonttype = "Verdana";            // skrifttyppe
$width = "72";                    // Tekst brede
$height = "48";                  // Tekst højde
$italic = "";                    // Tekst Kursiv
$weight = "400";                  // Tekst tykkelse
$underline = "";                  // Tekst Understreg
$strikeout = "";                  // Tekst Overstreg
$orientation = "0";              // Tekst vinkel
$linebreak = 100;                // Linie afstand

$handle = printer_open($printer); // skaber forbindelse til printeren via pc
printer_start_doc($handle, $opgave_navn);
printer_start_page($handle);

$font = printer_create_font($fonttype, $height, $width, $weight, $italic, $underline, $strikeout, -$orientation); // tekst oplysninger om den udskrevet tekst
printer_select_font($handle, $font);

function print_linebreak($newtext, $lby = 10)
{
  printer_draw_text($handle, strstr($newstext, chr(10), true), 10, $lby);
  $text3 = strstr($newstext, chr(10));
  if ($text3) {
    $lby += $linebreak;
    print_linebreak($text3, $lby);
  }
}

if ($text) {
  $text2 = wordwrap($text, 20, chr(10));
  print_linebreak($text2);
}
printer_delete_font($font);

printer_end_page($handle);
printer_end_doc($handle);
printer_close($handle);
echo "Har printet \"" . $type . "\" Uden problemer. <br>Fra bruger " . $_GET["user"] . "<br>Beskeder er ikke sendt til " . $to = $_GET["to"] . " da dette er en printer funktion";
// dette script bliver skrevet til på følgendene måde http://192.168.100.3/sms-print.php?user=BRUGER&password=PASSWORD&api_id=ID&to=MOBILNR&text=Hello world.
// bruger kun http://192.168.100.3/sms-print.php?text=Hello world.
?>


Men stadig uden resultat.

Vi ved at vi skal bede den loope en funktion med en ny placering for at det virker.

Jeg genopretter for at kunne tilføje flere point.
Avatar billede ggxdg Nybegynder
21. august 2010 - 16:08 #1
du skriver at flg. laver firkanter, laver den ikke "lineskift" også?

function print_linebreak($fhandle, $newtext, $lby = 10)
{
  $text4 = substr($newtext,strpos($newtext,chr(10)));
  echo "text4: ".$text4."\n";
  printer_draw_text($fhandle, $text4, 10, $lby);
  $text3 = strstr($newstext, chr(10));
  if ($text3) {
    echo "text3: ".$text3."\n";
    $lby += 100; //afstand du vil offsette næste linie
    print_linebreak($text3, $lby);
  }
}
if ($text) {
  $text2 = wordwrap($text, 20, chr(10));
  print_linebreak($handle, $text2);
}

Hvis den laver linie skift, kan man nok fikse firkanter ved at sige:
$text4 = substr($newtext,strpos($newtext,chr(10))-1);

Hvis den ikke gør, kan man evt. prøve mat udskifte alle chr(10) i scriptet, med en string som f.eks "<LB>" eller "<CRLF>" eller hvad man nu lyster.
Avatar billede kodak Mester
21. august 2010 - 16:16 #2
det gør den ikke.
Avatar billede ggxdg Nybegynder
21. august 2010 - 16:41 #3
function print_linebreak($fhandle, $newtext, $lby = 10)
{
  $text4 = substr($newtext,strpos($newtext,"<CRLF>")-6);
  echo "text4: ".$text4."\n";
  printer_draw_text($fhandle, $text4, 10, $lby);
  $text3 = strstr($newstext, "<CRLF>");
  if ($text3) {
    echo "text3: ".$text3."\n";
    $lby += 100; //afstand du vil offsette næste linie
    print_linebreak($text3, $lby);
  }
}
if ($text) {
  $text2 = wordwrap($text, 20, "<CRLF>");
  echo "text2: ".$text2."\n";
  print_linebreak($handle, $text2);
}


Skriv lige de forskellige echos fra ovenstående herinde.
Avatar billede ggxdg Nybegynder
21. august 2010 - 16:43 #4
flg skal måske ændres, hvis den kapper teksten af, hvilket den nok gør.

$text4 = substr($newtext,strpos($newtext,"<CRLF>"));
Avatar billede kodak Mester
22. august 2010 - 01:58 #5
teksten er:
hej med det dette er en længere tekst som sikkert haller ikke virker men teksten er lang nok til en test.

text2: hej med det dette eren længere tekst somsikkert haller ikkevirker men tekstener lang nok til entest.

text4: tte eren længere tekst somsikkert haller ikkevirker men tekstener lang nok til entest.
Avatar billede kodak Mester
22. august 2010 - 01:59 #6
Den har fjernet nogle mellemrum.
Men ellers skiftet linie, men ikke på printet.
Avatar billede kodak Mester
22. august 2010 - 02:00 #7
der hvor den fjerner mellemrum er der [] på print
Avatar billede kodak Mester
22. august 2010 - 02:09 #8
med #4

text2: hej med det dette eren længere tekst somsikkert haller ikkevirker men tekstener lang nok til entest.

text4: en længere tekst somsikkert haller ikkevirker men tekstener lang nok til entest.
Avatar billede ggxdg Nybegynder
22. august 2010 - 08:16 #9
$lby2 = $lby+100; //afstand du vil offsette næste linie
echo "Offset: ".$lby2;
print_linebreak($fhandle, $text3, $lby2);

Så burde det hulme at fungere.

Smid lige offset herind.



hvis der virker, så prøv med
$text4 = substr($newtext,strpos($newtext,chr(10)));
igen
Avatar billede ggxdg Nybegynder
22. august 2010 - 08:19 #10
det betyder så at alle de steder der står

"<CRLF>"

skal udskiftes med

chr(10)

igen hvis du prøver igen med

$text4 = substr($newtext,strpos($newtext,chr(10)));
Avatar billede kodak Mester
22. august 2010 - 11:33 #11
den viser slet ikke echo offset.
Avatar billede ggxdg Nybegynder
22. august 2010 - 19:30 #12
function print_linebreak($fhandle, $newtext, $lby = 10)
{
  $text4 = substr($newtext,strpos($newtext,"<CRLF>")-6);
  echo "text4: ".$text4."\n";
  printer_draw_text($fhandle, $text4, 10, $lby);
  $text3 = strstr($newstext, "<CRLF>");
  echo "text3: ".$text3."\n";
  $lby2 = $lby+100; //afstand du vil offsette næste linie
  echo "Offset: ".$lby2;
  print_linebreak($fhandle, $text3, $lby2);
}
if ($text) {
  $text2 = wordwrap($text, 20, "<CRLF>");
  echo "text2: ".$text2."\n";
  print_linebreak($handle, $text2);
}

skriv lige echos herind
Avatar billede kodak Mester
23. august 2010 - 00:07 #13
Glem det den repeter echo so mange gange at browseren vælger at lukke siden ned.
Avatar billede ggxdg Nybegynder
23. august 2010 - 11:13 #14
Grrr...

function print_linebreak($fhandle, $newtext, $i = 0, $lby = 10)
{
  $text4 = substr($newtext,strpos($newtext,"<CRLF>"));
  echo "text4: ".$text4."\n";
  //printer_draw_text($fhandle, $text4, 10, $lby);
  $text3 = strstr($newstext, "<CRLF>");
  if ($text3) {
    echo "text3: ".$text3."\n";
    $lby2 = $lby+100; //afstand du vil offsette næste linie
    echo "Offset: ".$lby2;
    if ($i <= 10) {
      $i++
      print_linebreak($fhandle, $text3, $i, $lby2);
  } else { echo "Loops overstiger 10"; }
}
if ($text) {
  $text2 = wordwrap($text, 20, "<CRLF>");
  echo "text2: ".$text2."\n";
  print_linebreak($handle, $text2);
}


Gør den det stadig med ovenstående?
Jeg er meget interreseret i text 4 og 3.
4 skulle gerne indeholde det der skal udskrives
3 skulle gerne indeholde det der skal sendes videre
Offset skulle gerne være stigende

Nu er der bygget en anti infinite loop-fætter ind
Avatar billede kodak Mester
23. august 2010 - 11:22 #15
Parse error: syntax error, unexpected T_STRING in C:\xampp\htdocs\sms-print2.php on line 42

Er:
      print_linebreak($fhandle, $text3, $i, $lby2);
Avatar billede ggxdg Nybegynder
23. august 2010 - 11:27 #16
Jeg er da en kæmpe tumpe... jeg har stirret mig blind på det rod jeg har fået lavet, når man bare kunne bruge explode og et foreach loop

if ($text) {
  $text2 = wordwrap($text, 20, chr(10));
  $text_arr = explode($text2, chr(10));
  $i = 10;
  foreach ($text_arr as $val){
    echo "Text til udskrift: ".$val."\n Offset: ".$i."\n";
    //printer_draw_text($handle, $val, 10, $i); //udskriv
    $i = $i + 100; //offset
  }
}


Jeg har lavet print-delen som comment til du lige har testet det.

Kortere version


if ($text) {
  $i = 10;
  foreach (explode(wordwrap($text, 20, chr(10)), chr(10)) as $val){
    printer_draw_text($handle, $val, 10, $i); //udskriv
    $i += 100; //offset
  }
}
Avatar billede ggxdg Nybegynder
23. august 2010 - 11:31 #17
En af ovenstående muligheder skal erstatte alt det skrammel jeg fik bikset sammen længere oppe.

Hvis
chr(10)
stadig ikke fungerer som adskiller i scriptet, kan du udskifte den med en eller anden string.

Den korte version fungerer sikkert ikke, mange funktioner bryder sig ikke om at man pakker det for meget, og jeg syntes aldrig jeg kan få $i += 100; til at fungere...
Avatar billede ggxdg Nybegynder
23. august 2010 - 11:54 #18
i #14 havde jeg glemt semikolon efter $i++;

Men mine foreach er uendeligt mange gange bedre... Jeg fatter ikke forfor jeg gjorde det hele så bøvlet, når jeg ganske udemærket kender explode og foreach...
Avatar billede kodak Mester
23. august 2010 - 11:58 #19
Resultat på 1:
function print_linebreak($fhandle, $newtext, $lby = 10)
{
  $text4 = substr($newtext,strpos($newtext,"<CRLF>"));
  echo "text4: ".$text4."\n<br>";
  printer_draw_text($fhandle, $text4, 10, $lby);
  $text3 = strstr($newstext, "<CRLF>");
  if ($text3) {
    echo "text3: ".$text3."\n<br>";
    $lby2 = $lby+100; //afstand du vil offsette næste linie
echo "Offset: ".$lby2;
print_linebreak($fhandle, $text3, $lby2);
  }
}
if ($text) {
  $text2 = wordwrap($text, 20, chr(10));
  $text_arr = explode($text2, chr(10));
  $i = 10;
  foreach ($text_arr as $val){
    echo "Text til udskrift: ".$val."\n Offset: ".$i."\n";
    //printer_draw_text($handle, $val, 10, $i); //udskriv
    $i = $i + 100; //offset
  }
}

Melder:
Text til udskrift: Offset: 10
Og printer: Blankt


Resultat på 2:
function print_linebreak($fhandle, $newtext, $lby = 10)
{
  $text4 = substr($newtext,strpos($newtext,"<CRLF>"));
  echo "text4: ".$text4."\n<br>";
  printer_draw_text($fhandle, $text4, 10, $lby);
  $text3 = strstr($newstext, "<CRLF>");
  if ($text3) {
    echo "text3: ".$text3."\n<br>";
    $lby2 = $lby+100; //afstand du vil offsette næste linie
echo "Offset: ".$lby2;
print_linebreak($fhandle, $text3, $lby2);
  }
}
if ($text) {
  $i = 10;
  foreach (explode(wordwrap($text, 20, chr(10)), chr(10)) as $val){
    printer_draw_text($handle, $val, 10, $i); //udskriv
    $i += 100; //offset
  }
}
Melder:
Blankt
Og printer: En liggendene []
Avatar billede ggxdg Nybegynder
23. august 2010 - 12:06 #20
<?php
$opgave_navn = "SMS Print";      // navnet du vil kunne se på dokumentet i udskrift listen
$printer = "\\\\192.168.100.3\\HP Color LaserJet 2600n"; // kilden til printeren
$user = $_GET["user"];            // brugernavn bliver modtaget
$password = $_GET["password"];    //password bliver modtaget
$text = "Til " . $_GET["user"] . "<br>" . $_GET["text"] . ""; // Bruger og tekst bliver modtaget
$api_id = $_GET["api_id"];        // id bliver modtaget
$to = $_GET["to"];                // modtagerens mobilnummer bliver modtaget
$fonttype = "Verdana";            // skrifttyppe
$width = "72";                    // Tekst brede
$height = "48";                  // Tekst højde
$italic = "";                    // Tekst Kursiv
$weight = "400";                  // Tekst tykkelse
$underline = "";                  // Tekst Understreg
$strikeout = "";                  // Tekst Overstreg
$orientation = "0";              // Tekst vinkel
$linebreak = 100;                // Linie afstand

$handle = printer_open($printer); // skaber forbindelse til printeren via pc
printer_start_doc($handle, $opgave_navn);
printer_start_page($handle);

$font = printer_create_font($fonttype, $height, $width, $weight, $italic, $underline, $strikeout, -$orientation); // tekst oplysninger om den udskrevet tekst
printer_select_font($handle, $font);

if ($text) {
  $text2 = wordwrap($text, 20, chr(10));
  echo "Wordwrapped tekst: ".$text2."\n<br />";
  $text_arr = explode(chr(10), $text2);
  $i = 10;
  foreach ($text_arr as $val){
    echo "Text til udskrift: ".$val."\n Offset: ".$i."\n";
    //printer_draw_text($handle, $val, 10, $i); //udskriv
    $i = $i + 100; //offset
  }
}

printer_delete_font($font);

printer_end_page($handle);
printer_end_doc($handle);
printer_close($handle);
echo "Har printet \"" . $type . "\" Uden problemer. <br>Fra bruger " . $_GET["user"] . "<br>Beskeder er ikke sendt til " . $to = $_GET["to"] . " da dette er en printer funktion";
// dette script bliver skrevet til på følgendene måde http://192.168.100.3/sms-print.php?user=BRUGER&password=PASSWORD&api_id=ID&to=MOBILNR&text=Hello world.
// bruger kun http://192.168.100.3/sms-print.php?text=Hello world.
?>


Det hjælper nok lidt at lave explode funktionen rigtigt også...
Avatar billede ggxdg Nybegynder
23. august 2010 - 12:07 #21
Kort version med rettet explode.

if ($text) {
  $i = 10;
  foreach (explode(chr(10), wordwrap($text, 20, chr(10))) as $val){
    printer_draw_text($handle, $val, 10, $i); //udskriv
    $i += 100; //offset
  }
}
Avatar billede kodak Mester
23. august 2010 - 16:01 #22
#20 Resultat:

Wordwrapped tekst: Til exp
hej med det dette er en længere tekst som sikkert haller ikke virker men teksten er lang nok til en test.
Text til udskrift: Til exp
hej med Offset: 10 Text til udskrift: det dette er en Offset: 110 Text til udskrift: længere tekst som Offset: 210 Text til udskrift: sikkert haller ikke Offset: 310 Text til udskrift: virker men teksten Offset: 410 Text til udskrift: er lang nok til en Offset: 510 Text til udskrift: test. Offset: 610 Har printet "" Uden problemer.
Fra bruger exp
Beskeder er ikke sendt til da dette er en printer funktion

Udskrift: Blank

#21 Resultat:

Har printet "" Uden problemer.
Fra bruger exp
Beskeder er ikke sendt til da dette er en printer funktion

Udskrift:
Til exp<br>hej med
det dette er en
længere tekst som
sikkert haller ikke
virker men teksten
er lang nok til en
test
Avatar billede kodak Mester
23. august 2010 - 16:01 #23
Udskriften virker.
Avatar billede ggxdg Nybegynder
23. august 2010 - 19:09 #24
Finally da :P

Det er simpelthen utroligt hvor meget man kan faile...
Avatar billede ggxdg Nybegynder
23. august 2010 - 19:12 #25
ved # 20 havde jeg lavet printet til en comment, for at undgå at du spildte alt for meget papir hvis det nu ikke virkede.

Men super at den korte version fungerede :)
Avatar billede kodak Mester
25. august 2010 - 15:05 #26
Takker for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester