chilek / lms

Lan Management System (LMS) public GIT repo
http://lms.org.pl
126 stars 136 forks source link

improvement: each html document is converted to pdf before merge #2342

Closed rafalpietraszewicz closed 1 year ago

rafalpietraszewicz commented 1 year ago

W kwestii protokołów to ta linia https://github.com/chilek/lms/compare/master...rafalpietraszewicz:rwcontractprotocol-3?expand=1#diff-1bd41d8b1df63dc60f83a4b613a1651aaf3bfb9c9d29fa873a37711dcd26804dL155 powodowała problem. Otóż jeśli drukowana była umowa bez załączników ale z protokołem jako powiązanymi dokumentami, to umowa i protokół jako dokumenty HTML najpierw były łączone, a dopiero potem konwertowane do PDF. Powodowało to nadpisywanie CSS umowy przez CSS protokołu. Po tej zmianie dla każdego dokumentu, który ma zostać wydrukowany zostanie wzięta zawartość z cache albo wygenerowana nowa zawartość PDF i dopiero wtedy dołączona do dokumentu końcowego/zbiorczego PDF. W ten sposób niezależnie od tego ile będzie łączonych dokumentów HTML nie będą wzajemnie zaburzać swoich CSS. Lub inaczej mówiąc każdy drukowany dokument HTML zachowa swój wygląd w zbiorczym PDF. Przy okazji zrobiłem mały refactoring tej części kodu pod kątem uproszczenia instrukcji warunkowych. Wydaje mi się, że po zmianie będzie to bardziej przejrzyste.

Przydałoby się to do stabilej gałęzi również dać jeśli nie jest zbyt inwazyjne.

chilek commented 1 year ago

Nie przeglądałem jeszcze zmian, ale z Twojego opisu odnoszę wrażenie, że każdy HTML chcesz oddzielnie konwertować do PDF?

W przypadku, gdy zaznaczymy 100 dokumentów w HTML do wydruku będziemy mieli 100 oddzielnych konwersji do PDF, a potem złączenie 100 PDF-ów?

chilek commented 1 year ago

Polecam lekturę: https://css-tricks.com/saving-the-day-with-scoped-css/ Myślę, że drobne korekty elementu style we wszystkich szablonach powinny załatwić sprawę.

chilek commented 1 year ago

Obecne wersje ptzeglądarek nie obsługują już atrybutu scoped dla elementu style. To wyewoluowało w shadow-dom API.

rafalpietraszewicz commented 1 year ago

Nie przeglądałem jeszcze zmian, ale z Twojego opisu odnoszę wrażenie, że każdy HTML chcesz oddzielnie konwertować do PDF?

W przypadku, gdy zaznaczymy 100 dokumentów w HTML do wydruku będziemy mieli 100 oddzielnych konwersji do PDF, a potem złączenie 100 PDF-ów?

Dokładnie tak to wygląda. Poza tym to dotyczy tylko dokumentów bez cache. W przypadku kiedy mamy kilka typów dokumentów HTML w wydruku będą one zakłócać swoje style. W tym co proponuję style w każdym dokumencie będą mogły być dowolne. Skoro pytasz o taką ilość, to pewnie przewidujesz jakieś problemy wydajnościowe. Dobrze myślę?

chilek commented 1 year ago

Skoro pytasz o taką ilość, to pewnie przewidujesz jakieś problemy wydajnościowe. Dobrze myślę?

Tak. To rozwiązanie będzie działać, ale przy dużej liczbie dokumentów (są takie pojedyncze wdrożenia), będzie zamulać się :(

Przykład użycia techniki Shadow DOM (dzialający):

<html>
    <body>
        <div class="page">
            <html>
                <head>
                    <style>

                        * {
                            color: green;
                        }

                    </style>
                </head>
                <body>
                    <p>
                        Text 1
                    </p>
                </body>
            </html>
        </div>

        <div class="page">
            <html>
                <head>
                    <style>

                        * {
                            color: red;
                        }

                    </style>
                </head>
                <body>
                    <p>
                        Text 2
                    </p>
                </body>
            </html>
        </div>
    </body>
</html>

<script>

    let pages = document.querySelectorAll('.page');
    if (pages.length) {
        pages.forEach(function(page) {
            let pageShadow = page.attachShadow({
                mode: "closed"
            });
            let innerHTML = page.innerHTML;
            page.innerHTML = '';
            pageShadow.innerHTML = innerHTML;
        });
    }

</script>

Jedyny problem jaki występuje to taki, że efektywnie elementy html, head i body w osadzonych HTML znikają i rzutują się do eementów z aawartością. Ale akurat to dotað też występowało - wewnątrz <oage> też html nie było, ani head i body. Trzeba poprawoać jeszcze nad tym drugim problemem. Albo po prostu ałożyć, że w szalonach dokumentów nie stylizujemy nic przez element body (kto wie, może tak jest dla większości szablonów).

chilek commented 1 year ago

Generalnie - trzeba po prostu zmodernizować niejako przyokazji łączenie wielu HTML - użycie obecne elementu <page> to taka trochę prowizorka...

chilek commented 1 year ago

Wynik działania skryptu:

image

:)

chilek commented 1 year ago

Poszedł testowy commit w master: https://github.com/chilek/lms/commit/d34101e5fa3773a880ae0c53a0d67e6f702a4473 Trzeba najpierw przetestować go w HakerNet.

chilek commented 1 year ago

Wygląda, że czcionki są ok, ale otwiera się w pewnym sensie inny, wcześniej uśpiony/ukryty problem. Stylizacja marginesów strony przestaje działać - przez, co wszystkie złączone dokumenty HTML swoją zawartość mają na całej zawartości strony. To oczywiste - w końcu wyjorzystywaliśy do tej pory ukrytą fumkcję nadpisującą globalnie CSS i dzieki temu dobrze wpisane marginesy w dokumencie umowa pośrednio wpływały również na marginesy dla innych włączonych dokumentów html. Trzeba pewnie globalnie marginesu ustawiać w wirtualnym pliku html tworzonym na chwilę na potrzeby konwersji?

chilek commented 1 year ago

https://github.com/chilek/lms/commit/20043cbf7b7fbbc17a4131f3b296fda4f9f7474c

chilek commented 1 year ago

Wygląda dla mnie ok w HakerNET. Trzeba poprosić go o testy jego Apple-fun-boy-owymi oczyma :)