Closed rafalpietraszewicz closed 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?
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ę.
Obecne wersje ptzeglądarek nie obsługują już atrybutu scoped dla elementu style. To wyewoluowało w shadow-dom API.
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ę?
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).
Generalnie - trzeba po prostu zmodernizować niejako przyokazji łączenie wielu HTML - użycie obecne elementu <page>
to taka trochę prowizorka...
Wynik działania skryptu:
:)
Poszedł testowy commit w master: https://github.com/chilek/lms/commit/d34101e5fa3773a880ae0c53a0d67e6f702a4473 Trzeba najpierw przetestować go w HakerNet.
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?
Wygląda dla mnie ok w HakerNET. Trzeba poprosić go o testy jego Apple-fun-boy-owymi oczyma :)
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.