Toon posts:

[PHP/JS] Specifiek deel pagina printen

Pagina: 1
Acties:

Onderwerpen


  • Daantju
  • Registratie: April 2014
  • Laatst online: 05-06 21:40
Hallo! Ik zit met het volgende.

Ik heb een pagina gemaakt die automatisch een barcode genereert op basis van de laatste entry in de database. ($reparatieid). Dit gaat goed. De barcode is een PNG image die ik gecentreerd heb in een DIV op mijn paginatemplate.

Nu wil ik deze barcode printen op mijn labelprinter(Dymo labelwriter450), het liefst met 1 druk op een button. het probleem is, dat wanneer ik onclick:window.print gebruik de gehele pagina wordt geprint, terwijl ik dus echt alleen de barcode geprint wil hebben op het kleine labelstickertje.

Zit al dik een dag te zoeken, maar kom er nog niet uit. Iemand ervaringen hiermee?

[Voor 6% gewijzigd door Daantju op 29-11-2014 01:23]


  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 01:50

krvabo

MATERIALISE!

Css: http://stackoverflow.com/...rint-only-parts-of-a-page
JS: http://stackoverflow.com/...d-html-page-in-javascript

De JS-manier is basicly 'kopieer de content naar een popup, focus, print', en de css-manier is 'met een aparte print-stylesheet alles hiden behalve wat je wil printen'.

De CSS-manier is netter, maar de JS-manier minder foutgevoelig (edoch 'lelijker')

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


  • Daantju
  • Registratie: April 2014
  • Laatst online: 05-06 21:40
Thanks!! Hmm, wordt er nog niet heel erg duidelijker van :( De JS manier lijkt me voor nu het beste, ben namelijk echt geen pro hierin.

Een popup openen lukt me, maar daarna de focus/print ben je me kwijt, hehe.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
dit is niet de manier...

je kunt het Dymo framework downloaden van de dymo site... dat is een JS file die je include op je pagina... vervolgens kun je van daaruit een vooraf gedefinieerd label afdrukken waarbij je variabele waarden kan zetten zoals bijvoorbeeld een barcode....

zie: http://developers.dymo.co...ry-samples-print-a-label/

  • Daantju
  • Registratie: April 2014
  • Laatst online: 05-06 21:40
Oh thanks! Dit ziet er inderdaad goed uit, heeft er iemand ervaring met de implementatie? Ik kan bijvoorbeeld het bestand printlabel.js niet vinden, en ik heb geen label vanuit de Dymo software, maar vanuit een PHP addon.. Het wordt een afbeelding die ik op elke pagina weer kan geven via
<img src="/barcode/barcode.php"> Deze is dan ook direct variabel

[Voor 23% gewijzigd door Daantju op 29-11-2014 14:00]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
de implementatie is heel eenvoudig... printlabel.js heb je niet nodig... wel het framework: DYMOLabelFramework.js (zie link in vorige post).

vervolgens ontwerp je in de Dymo software een label (dat is vrij eenvoudig: je neemt jouw labelformaat en sleept daar een barcode op... uiteindelijk sla je het label op als een .label bestand... dit bestand kun je openen met een texteditor, dan zul je zien dat het simpel XML is:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<DieCutLabel Version="8.0" Units="twips">
    <PaperOrientation>Landscape</PaperOrientation>
    <Id>LargeAddress</Id>
    <PaperName>30321 Large Address</PaperName>
    <DrawCommands>
        <RoundRectangle X="0" Y="0" Width="2025" Height="5020" Rx="270" Ry="270" />
    </DrawCommands>
    <ObjectInfo>
        <BarcodeObject>
            <Name>STREEPJESCODE</Name>
            <ForeColor Alpha="255" Red="0" Green="0" Blue="0" />
            <BackColor Alpha="0" Red="255" Green="255" Blue="255" />
            <LinkedObjectName></LinkedObjectName>
            <Rotation>Rotation0</Rotation>
            <IsMirrored>False</IsMirrored>
            <IsVariable>True</IsVariable>
            <Text>12345</Text>
            <Type>Code39</Type>
            <Size>Small</Size>
            <TextPosition>Bottom</TextPosition>
            <TextFont Family="Arial" Size="8" Bold="False" Italic="False" Underline="False" Strikeout="False" />
            <CheckSumFont Family="Arial" Size="8" Bold="False" Italic="False" Underline="False" Strikeout="False" />
            <TextEmbedding>None</TextEmbedding>
            <ECLevel>0</ECLevel>
            <HorizontalAlignment>Center</HorizontalAlignment>
            <QuietZonesPadding Left="0" Top="0" Right="0" Bottom="0" />
        </BarcodeObject>
        <Bounds X="322" Y="135" Width="4463" Height="1620" />
    </ObjectInfo>
</DieCutLabel>



vervolgens kun je d.m.v. javascript de waardes zetten in je label en het label afdrukken (voorbeeld):
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    function printAddressLabel() {
        var labelXmlSTANDARD = '<?xml version="1.0" encoding="utf-8"?>.............[hier de xml van je label]';

        var labelEnvironment = dymo.label.framework.checkEnvironment();
        if (labelEnvironment.isFrameworkInstalled) {
            var labelSTANDARD = dymo.label.framework.openLabelXml(labelXmlSTANDARD);
            var labelsetSTANDARD = new dymo.label.framework.LabelSetBuilder();

            var record = labelsetSTANDARD.addRecord();
            record.setText("STREEPJESCODE", "[jouw streepjescode]");

            var printers = dymo.label.framework.getPrinters();
            if (printers.length == 0) {
                throw "Geen DYMO printer ge&iuml;nstalleerd. Installeer een DYMO printer.";
            }
            var printerName = "DYMO LabelWriter 450";
            for (var i = 0; i < printers.length; ++i) {
                var printer = printers[i];
                if (printer.printerType == "LabelWriterPrinter") {
                    printerName = printer.name;
                    break;
                }
            }

            labelSTANDARD.print(printerName, '', labelsetSTANDARD);
        }
    }

  • Daantju
  • Registratie: April 2014
  • Laatst online: 05-06 21:40
Okay, duidelijk opzich! Maar dan moet ik op line 10 eigenlijk mijn afbeelding kwijt kunnen toch?

HTML:
1
<img src="/barcode/barcode.php">


Deze afbeelding bevat de barcode zelf, en is op basis van een ID en dus steeds verschillend.

Dan zou dat worden:
var record = labelsetSTANDARD.addRecord();
record.setText("STREEPJESCODE", "<img src="/barcode/barcode.php">");

right?

De code die de barcode genereert als plaatje:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php

header('Content-Type: image/png');

//verbinding met de database maken
  $link = mysqli_connect("localhost","root","","dbnaam",330*);
if(!$link){
    exit;
}

//veld selecteren op laatste toegevoegd
$reparatieid = "SELECT reparatieid FROM reparatie ORDER BY toegevoegd DESC LIMIT 1";
$result = $link->query($reparatieid);

//Wanneer gelukt, geef laatst toegevoegd reparatieID weer.
if ($result->num_rows > 0) {
    while ($row = $result->fetch_assoc()) {
           
//Barcode files includen
require_once('class/BCGFontFile.php');
require_once('class/BCGColor.php');
require_once('class/BCGDrawing.php');

//Type barcode selecteren (Type 128)
require_once('class/BCGcode128.barcode.php');

//kleuren van de barcode en tekst
$colorFront = new BCGColor(0, 0, 0);
$colorBack = new BCGColor(255, 255, 255);

//barcode genereren
$code = new BCGcode128(); // Barcode type
$code->setScale(2); // Resolutie afbeelding
$code->setThickness(30); // Dikte van de lijnen
$code->setBackgroundColor($colorBack); // Kleur van de tussenruimte
$code->parse($row ["reparatieid"]); // Het ID

//Barcode weergeven als afbeelding
$drawing = new BCGDrawing('', $colorBack);
$drawing->setBarcode($code);
$drawing->draw();


$drawing->finish(BCGDrawing::IMG_FORMAT_PNG);

    }

 //Wanneer niet gelukt, geef "0 waarden" aan    
    }




?>

 

[Voor 65% gewijzigd door Daantju op 30-11-2014 10:31]


  • NNF
  • Registratie: November 2003
  • Laatst online: 14-03 11:13
Volgens mij moet je dat zelfgebakken plaatje met die barcode gewoon vergeten en maakt de Dymo-software zélf een barcode aan de hand van text input. Oftewel, je moet op regel 10 het reparatie-ID uit de database hebben. Kun je ophalen met AJAX, of quick and dirty in de JS file echo'en :P

  • Daantju
  • Registratie: April 2014
  • Laatst online: 05-06 21:40
Hmm, zo dus? PHP/JS wel door elkaar nu..

JavaScript:
1
2
var record = labelsetSTANDARD.addRecord();
            record.setText("STREEPJESCODE", "parse($row ["reparatieid"]);");

  • NNF
  • Registratie: November 2003
  • Laatst online: 14-03 11:13
Kan :) Niet zoals het daar staat, maar dan zou je dus je JS file door PHP moeten laten parsen en op de plek waar dat nodig is, dat ID echo'en. Krijg je wel PHP en JS door elkaar heen en dat is niet echt mooi of fijn leesbaar.

Netter is het reparatie-ID ophalen en als parameter meegeven aan de functie printAddressLabel:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//verbinding met de database maken
$link = mysqli_connect("localhost","root","","dbnaam",330*);

if(!$link) {
    exit;
}

//veld selecteren op laatste toegevoegd
$reparatieid = "SELECT reparatieid FROM reparatie ORDER BY toegevoegd DESC LIMIT 1";
$result = $link->query($reparatieid);

//Wanneer gelukt, geef laatst toegevoegd reparatieID weer.
if ($result->num_rows > 0) {
    $row = $result->fetch_assoc();
    echo $row['reparatieid'];
} else {
    echo 0;
}


JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
var barcodeRequest = new XMLHttpRequest();

function printAddressLabel(barcode) {
    var labelXmlSTANDARD = '<?xml version="1.0" encoding="utf-8"?>.............[hier de xml van je label]';

    var labelEnvironment = dymo.label.framework.checkEnvironment();
    if (labelEnvironment.isFrameworkInstalled) {
        var labelSTANDARD = dymo.label.framework.openLabelXml(labelXmlSTANDARD);
        var labelsetSTANDARD = new dymo.label.framework.LabelSetBuilder();

        var record = labelsetSTANDARD.addRecord();
        record.setText("STREEPJESCODE", barcode);

        var printers = dymo.label.framework.getPrinters();
        if (printers.length == 0) {
            throw "Geen DYMO printer ge&iuml;nstalleerd. Installeer een DYMO printer.";
        }
        var printerName = "DYMO LabelWriter 450";
        for (var i = 0; i < printers.length; ++i) {
            var printer = printers[i];
            if (printer.printerType == "LabelWriterPrinter") {
                printerName = printer.name;
                break;
            }
        }

        labelSTANDARD.print(printerName, '', labelsetSTANDARD);
    }
}

barcodeRequest.open('GET', 'barcode.php', true);

barcodeRequest.onload = function () {
    var response;
    if (barcodeRequest.status === 200) { // Succes!
        response = JSON.parse(barcodeRequest.responseText);
        if (response > 0) {
            printAddressLabel(response);
        } else {
            // barcode.php heeft geen record kunnen vinden in DB
        }
    } else {
        // Server gaf foutcode terug - afhandelen
    }
};

barcodeRequest.onerror = function() {
    // Fout opgetreden tijdens AJAX request; afhandelen
};

barcodeRequest.send();

[Voor 3% gewijzigd door NNF op 30-11-2014 17:42]


  • Daantju
  • Registratie: April 2014
  • Laatst online: 05-06 21:40
Top ik ga het proberen! Moeten beide stukken code in dezelfde file, of verschillende ?

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
de bovenste is je barcode.php de onderste het javascript op de pagina waar je vandaan moet printen...

overigens vind ik het wel vreemd dat je dat vraagt.. je hebt het immers voor elkaar gekregen een barcode image te genereren in php... dan verwacht ik toch nog wel een beetje basiskennis m.b.t. de hier geposte code :)

  • Daantju
  • Registratie: April 2014
  • Laatst online: 05-06 21:40
Het is gelukt! Heel erg bedankt voor de hulp allemaal :)

Ik heb ook een nieuwe vraag, zal dat maar in hetzelfde topic doen.

Als er een reparatie wordt aangemaakt, moet deze worden gekoppeld aan een klant. Ik heb hiervoor een testbox(form) met daarnaast een knop "Bestaande klant". Als ik hierop klik wordt inderdaad een webpagina met klanten overzicht getoond. maar hoe zorg ik er nou voor, dat ik een klant kan selecteren zodat de textbox uit het formulier ook daadwerkelijk wordt gevuld? Liefst in PHP..

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 05-06 10:41

NMe

Quia Ego Sic Dico.

Dan zou ik eens beginnen met een nieuw topic over dat onderwerp waarin je je houdt aan De Quickstart en daarbij dus genoeg informatie geeft over wat je precies wil en waarom je dat zonder hulp niet lukt. Met je vraag in deze vorm is onderhand het enige geschikte antwoord dat we kunnen geven een compleet uitgewerkte testcase en daar is dit forum niet voor bedoeld.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee