NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Tomáš Dvořák:9.11.2021 11:12

Nedaří se mi exportovat html OL, LI seznamy do PDF pomocí knihovny mPDF. Na zobrazení používám CSS:

<style>
    ol {
      list-style-type: none;
      counter-reset: item;
      margin: 0;
      padding: 0;
    }

    ol > li {
      display: table;
      counter-increment: item;
      margin-bottom: 0.6em;
    }

    ol > li:before {
      content: counters(item, ".") ". ";
      display: table-cell;
      padding-right: 0.6em;
    }

    li ol > li {
      margin: 0;
    }

    li ol > li:before {
      content: counters(item, ".") " ";
    }
</style>

zobrazení je pak takové to:

1. uvod
1.1. seznam
1.1.1. kolo
1.1.2 slapatko
1.2. auto
1.3. kolo
1.3.1 sroub
2. pokracovani

V pdf používám css toto:

ol {
  counter-reset: item
}
li {
  display: block
}
li:before {
  content: counters(item, ".") " ";
  counter-increment: item
}

Ale neumí to počítat a zobrazuje se to takto:

1. uvod
1. seznam
1. kolo
2. slapatko
1. auto
2. kolo
1 sroub
2. pokracovani

Neumí z CSS použít automatické počítání. Řešil to už někdo?

 
Odpovědět
9.11.2021 11:12
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:9.11.2021 15:30

K tomu kodu, co jsi dal, se neda nic rici. ten tez bez html kodu nedava zadny smysl. Tezko rici, proc ti nejaky, tez nezverejneny php kod, selhal :)

Ja pouzivam fPDf. To umi pracovat jen s html kodem.
Ma jen omezene schopnosti. Musel jsem si napsat konvertor tabulku v tabulce tak, ze jsem puvodni tabulku ukoncil a otevrel novou :) Cili, predpokladam, ze bude pro tebe asi nejednodussi, napsat si konverzi seznamu, ktery dostane nejakou class na div + span

<ol>
<li>text</li> ---> <div><span>1.1.1</span><span>text</span></div>

To uz by mel umet ten konvertor aspon priblizne, prekodovat.

 
Nahoru Odpovědět
9.11.2021 15:30
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:9.11.2021 15:44

Ps. Tez jsem mel potize s UTF fonty a fura dalsiho. Ale, to se dalo cekat od zjednodusene pdf knihovny :)

google = mpdf structured ol

http://mpdf.github.io/ - dokumentace
http://mpdf.github.io/…ml-tags.html - ol, ul, li
http://mpdf.github.io/…ributes.html - font-size, type, start
http://mpdf.github.io/…ted-css.html - slovo counters se na te strance nevyskytuje
A jestli to spravne chapu, tak to umi ruzne odrazky, ale countery vubec. Ale, tak s tim se musi pocitat, kdyz se pouziva takovyto konvertor, ze to neco neumi.
https://mpdf.github.io/…o/lists.html

google = mpdf structured html list
google = mpdf countered html list

https://github.com/…f/issues/122

Tag.php
change
case 'decimal': case '1': $blt = $this->mpdf->listcounter[$this->mpdf->listlvl] . $this->mpdf->list_number_suffix; break;
to
case 'decimal': case '1': $pre = ''; for ($loop = 1; $loop <= $this->mpdf->listlvl; $loop++) {$pre = $this->mpdf->listcounter[$this->mpdf->listlvl+1 - $loop].'.'.$pre;} $blt = substr($pre,0,-1); break;
 
Nahoru Odpovědět
9.11.2021 15:44
Avatar
Odpovídá na Peter Mlich
Tomáš Dvořák:11.11.2021 14:50

Peter Milch.
To jsem našel všechno taky a ta změna v kódu nepomohla, dle všeho se při generování ani do té části (netuším proč) vůbec nedostane.

K tomu konvertoru, mohl bys mě trochu nakopnout? Netuším jak počítat <ol> a respektive všechny html tagy, abych je mohl změnit na <div><span> ? Děkuji

 
Nahoru Odpovědět
11.11.2021 14:50
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.11.2021 15:26

Udelas si vlastni dekoder/parser kodu.
Kdyz najdes tag "<ol"... udelej...
Kdyz najdes tag "<li"... udelej...
kdyz to mas otevrene ...
A celou tu cast s OL-LI nahradis vlastnim html kodem s tagy div, span, ktere ten gerenetor pdfka umi.

Zkusim neco najit googlem v js.Zrovna se mi nedari ten js najit, ale pred lety to nekde bylo :)
google = ol list by js dotted prefix
google = structured number list by php from ul li
https://stackoverflow.com/…nested-array
V podstate by to melo byt podobne tomuto. Tady se snazi vytvaret strukturovane pole. Tak to je upravis tak, aby pocital zanoreni a cislo, ktere tam je.

<?php

class Parser {

    private $elements = [];

    public function parse() {
        $doc = new \DOMDocument();
        $doc->preserveWhiteSpace = false;
        $doc->loadHTMLFile("./html.html");

        $this->parseChildNodes($doc, $this->elements);
    }

    private function parseChildNodes($node, & $arrayToPush) {
        $indexPushed = count($arrayToPush);

        if ($node->nodeName == "li") {
            $representation = [
                "key" => $this->getDisplayValueFromNode($node),
                "items" => []
            ];
            array_push($arrayToPush, $representation);
            $arrayToPush = & $arrayToPush[$indexPushed]["items"];
        }

        if ($node->childNodes == null) {
            return;
        }
        foreach ($node->childNodes as $child) {
            $this->parseChildNodes($child, $arrayToPush);
        }
    }

    /**
     * Get the value of the node's first element
     * In our case this is the text value of the anchor tag
     *
     * @param $node
     * @return String
     */
    private function getDisplayValueFromNode($node) {
        return $node->firstChild->nodeValue;
    }

    public function getElements() {
        return $this->elements;
    }
}

$parser = new Parser();
$parser->parse();
print_r($parser->getElements());

Ale, klidne pouzij strpos.

$elm_start = ' class="my-ol-list"';
$OL_open = "<ol"
$OL_close = "</ol"
$LI_open = "<li"
$LI_close = "</li"
$elm_end = '<div'; // bud mas vsechny ol uzavrene nebo narazis na nejaky string, to je dobre dat do cyklu.
$pos_start = 0; //pak budes potrebovat ulozit pozici odkud-kam budes seznam nahrazovat
$pos_end = 0;

... a pak ty cykly, ktere se mi nechce jako vymyslet :)

 
Nahoru Odpovědět
11.11.2021 15:26
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:11.11.2021 15:34

Tohle nekdo chtel v jinem tematu. Je to menu vypsane jako id/id_parent/text. A chtel to preparsovat do strukturovaneho pole nebo neco tak. Mohlo by to byt takovou inspiraci, jak pouzivat predavani promenych. Si udelej proste bokem kod, kde mu predas string z menu a at ti to tam doplni ty cisla. A az to budes mit ok, tak si to prekopirujes do hlavniho kodu.

<?php
$list = array(
array(
    'Id' => 64899,
    'IdP' => 37671,
    'Name' => "Auto-moto"
),
array
(
    'Id' => 64868,
    'IdP' => 64899,
    'Name' => "Autochladničky"
),
array
(
    'Id' => 64876,
    'IdP' => 64868,
    'Name' => "Kompresorové autochladničky"
)
);

$out = array();
$pom = array();

echo '<pre>';

foreach($list as $row)
{
//var_dump($row);
list( $id, $idP, $name ) = array($row['Id'], $row['IdP'], $row['Name']);
//var_dump( $id, $idP );
if (isset($pom[ $idP ]))
        {
        $pom[ $idP ][ $id ] = array( 'IdP'=>$idP, 'Name'=>$name );
        $pom[ $id ] = &$pom[ $idP ][ $id ];
        }
else    {
        $out[ $id ] = array( 'IdP'=>$idP, 'Name'=>$name );
        $pom[ $id ] = &$out[ $id ];
        }
}

var_dump($out);


foreach($list as $row)
{
$path = array();
$id = $row['Id'];
for (;isset($pom[$id]);)
        {
        $path[] = $pom[$id]['Name'];
        $id = $pom[$id]['IdP'];
        }
echo implode(" > ", array_reverse($path))."\n";
}
?>
 
Nahoru Odpovědět
11.11.2021 15:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.