Generowanie PDF z ProReporta¶
Sente S4¶
Ta sekcja opisuje generowanie do PDFa bez udziału serwera Neos.
Co trzeba wiedzieć¶
- Nowy sposób generowania PDF z szablonu ProReporta ma następujące zalety:
- O ile na systemie jest drukarka "Microsoft XPS Printer" nie wymaga instalowania żadnego dodatkowego oprogramowania[1]
- Nie wymaga używania PDFCreatora ani BullZipa, dzięki czemu nie wymaga zapisywania plików ini ani rejestrów
- Lepiej obsługuje wsadowy tryb drukowania wielu dokumentów jednocześnie
- Jest oparty na darmowej i dostępnej dla Windows drukarki wirtualnej "Microsoft XPS Printer"
- Generuje plik XPS a następnie używając ghostscriptowego narzędzia gxpswin64 konweruje go na PDF
- Jest prosty w konfiguracji - wymaga jedynie podania ścieżki do wspomnianego narzędzia gxpswin64, reszta konfiguracji dzieje się automatycznie - w systemie zarejestrowana jest drukarka "PDF 2.0", której można używać
- Jest w pełni dozwolony do użytku komercyjnego, zakazana jest DYSTRYBUCJA gxpswin64, to znaczy, że nie wolno dołączać go do binarek i dystrybuować razem z aplikacją, pracownik klienta powinien samodzielnie pobrać go na swój komputer (oczywiście możemy mu w tym pomóc)
- Posiada też wady:
- po pierwsze wymaga samodzielnego pobrania gxpswin64
- pliki PDF generowane tą metodą są wyraźnie większe. Małe pliki mogą być 2 lub 3 razy większe. Dla większych różnica stopniowo zanika
- obrazki bitmapowe osadzane w wydrukach są lekko rozmyte, widać to wyraźnie w przypadku kodów paskowych, testy nie wykazały jednak większych problemów przy korzystaniu z dostępnych w firmie czytników
- GLOBALE nie działają, trzeba wydruk przerobić aby korzystał z parametrów przekazywanych tak jak w przykładzie.
Co trzeba skonfigurować¶
- Należy mieć Sente S4 podniesione technologicznie do wersji 4.3.5 lub wgrane zmiany C++ z tematu Pr111813. Najszybciej można to sprawdzić po tym, czy mamy dostępą do wyboru logiczną drukarkę "PDF 2.0" czy nie.
- Do folderu
.\output\ghostxps\należy mieć pobrany program GhostXPS w wersji dla Windows, zwykle 64bit - W systemie musi być dostępna drukarka "Microsoft XPS Printer", standardowo jest ona dostępna od Windows Vista, jeżeli jej brakuje postępujemy zgodnie z tym artykułem
- W pliku .app musi być wpisane:
[Printers]
PDF:GXPSWinPath=.\output\ghostxps\gxpswin64.exe
Neos¶
Co trzeba wiedzieć¶
- Generowanie pdfa odbywa się za pośrednictwem specjalnej, okrojonej wersji Sente S4 zwanej sserver3.exe
- Podobnie jak to ma miejsce przy transferze pliku, jest asynchroniczne
- Komunikacja pomiędzy sserver3.exe a neosem odbywa się w ten sposób, że neos wywołuje sserver3 ze wskazaniem do jakiej bazy danych ma się zalogować i na jakiego użytkownika (aplikacyjnego!) a potem wymiana danych następuje przez wpisy w tabeli NEOSSSERVER_DATA
- W celu minimalizacji problemów z niestabilnością C++, domyślnie każdy wydruk uruchamiany jest w osobnej instancji sserver3.exe, co pozwala na równoczesne generowanie wielu plików i pozwala posprzątać zasoby i wycieki pamięci S4, za cenę nieco wolniejszego generowania (aplikacja musi się załadować i zainicjować)
- Generować wydruki można zarówno na żądanie, z poziomu Sente S4 lub klienta WWW ale też wsadowo ze Schedulera
- Ponieważ wydruki są realizowane po stronie serwera aplikacja sserver3.exe musi mieć dostęp do tych samych wydruków co zwykłe S4, katalogi z wydrukami mogą być współdzielone, ponieważ sserver3.exe posiada standardowe opcje konfiguracyjne w swoim dedykowanym pliku .app
- Funkcjonalność została zrealizowana w formie pluginów, które można dołączyć do Neosów tak starych jak
4.0.11bez konieczności jego podnoszenia - Aktualnie możliwe jest jedynie generowanie pdfów z wydruków standardowych, aby wydrukować wydruk paramsowy, trzeba go przenieść do folderu standardu, nadgrywając ewentualnie oryginalny plik raportu
Co trzeba skonfigurować¶
- W bazie danych należy posiadać tabele NEOSSSERVER_DATA i NEOSSSERVER_STATES. Można to zrobić poprzez
- podniesienie technologiczne bazy danych do wersji 4.3.5
- wgranie zmian bazodanowych z tematu Pr111813
- wgranie przygotowanego skryptu
- Jeżeli na danym serwerze nie była nigdy instalowana aplikacja Sente S4, to:
- należy zainstalować tam demo naszej aplikacji w celu instalacji bibliotek VCL np.
vcl120.bpl - lub jeżeli nie jest to możliwe / dozwolone dodatkowo do katalogu dograć następujące pliki
- Zainstalować plugin Neos.SServer zgodnie z opisem
- Zainstalować plugin Neos.PReport.PdfPrinter zgodnie z opisem
Przykład¶
- Tworzymy obiekt oparty o tabelę NAGZAM
- Wyciągamy na formę przycisk, który po naciśnięciu będzie nam generował wydruk zdalnie
- Wklejamy następujący kod:
#if NEOS_PROREPORT_PDFPRINTER //dzięki temu projekt się będzie kompilował również bez pluginu
var _ref = this.REF;
var printAction = new PrintAction("zamow")//nazwa wydruku
.AddParameter("RPRT_NAGZAM", _ref);//parametry
string localRepoPath, remoteRepoPath;
API.GetRepositoryPath("PREZENTACJA", out localRepoPath, out remoteRepoPath);//pobranie ścieżki do repo
printAction.OutputPath = remoteRepoPath;//ustawienie miejsca zapisu wygenerowanego pliku pdf
printAction.OutputFile = string.Format("zamow_{0}",_ref);//i jego nazwy
printAction.OnError += (sender, args) => { //gdy :(
API.ShowBalloonHint(args.Message, "Błąd drukowania zamówienia "+_ref, IconType.STOP);
RefreshClient();
};
printAction.OnSuccess += (sender, args) => { // gdy :)
API.RunSQL("UPDATE NAGZAM SET WYDRUKOWANO=1 WHERE REF="+_ref);
RefreshData();
RefreshClient();
};
ProReport.QuickPrintPDF(printAction);//asynchroniczne wykonanie wydruku
#else
DEBUG.Log("Plugin Neos.ProReport.PDFPrinter nie został zarejestrowany");//gdy pluginu nie ma
#endif
Parametry akcji wydruku¶
Plugin PDFPrinter pozwala na konfigurację wszystkich parametrów akcji appini PrintReport. Aby ustalić te parametry należy w kodzie akcji neosowej dopisać (przykład dla nazwy drukarki):
printAction.Parameters.Add(new PrintParam("PrinterName", "nazwa drukarki"))
Więcej przykładów¶
Rozwiązywanie problemów¶
- Najpierw sprawdzamy czy pluginy Neos.SServer i Neos.PReport.PdfPrinter są prawidłowo zainstalowane, wtedy kod z przykładu będzie się kompilował
- Jeżeli kompiluje się, to sprawdzamy, czy mamy wpisy w tabeli NEOSSSERVER_DATA
- Jeżeli są uruchamiamy ręcznie z wiersza poleceń program sserver3.exe, wchodzimy do jego katalogu w którym się znajduje i wykonujemy polecenie, modyfikując odpowiednio parametry. Do
-idpodstawiamy numer jakiegoś wiersza w tabeli NEOSSSERVER_DATA, za-unazwę użytkownika APLIKACYJNEGO na którym realizowane będą wydruki, a za-phasło dla tego użytkownika
sserver3.exe --neos-slave -id2 -usente -p****** -db "localhost:C:\workspace\db\esystem.FDB" sserver3.app
- Jeżeli program uruchamia się i nie wyświetla błędów sprawdzamy, czy w katalogu
.\outputznajdują się jakieś wygenerowane pliki - jeżeli są pliki .xps, to znaczy, że źle zainstalowaliśmy program GhostXPS. - Jeżeli plików brak, zaglądamy do pliku
logfile.logw poszukiwaniu wskazówek błędów. Tam będą w szczególności problemy z samym wydrukiem, zła liczba parametrów itp. - Trzeba pamiętać, że sserver3.exe drukuje jedynie wydruki standardowe a nie te z katalogu
\params, aby wydrukować szablon paramsowy, trzeba definicję raportu przenieść do standardu
Note
Pamiętaj! SServer komunikuje się, z Neosem, za pomocą tabeli w bazie danych. Plugin SServera, który uruchamia proces SServer.exe, wcześniej przygotowuje komunikat w odpowiedniej tabeli. Żeby ten komunikat był widoczny przez proces sserver.exe musi zostać zacommitowana transakcja, która insertuje ten komunikat. Jeśli pracujesz w ramach metody logiki biznesowej, miej na uwadze, transakcja tam jest jedna i jest commitowana, dopiero po zakończenia całego stosu wywołań metod logiki. Zatem z poziomu metod logiki biznesowej drukowanie sserver NIE BĘDZIE DZIAŁAĆ. Osadź użycie sserver.exe w metodach interfejsowych lub w metodach Schedulera. Dotyczy to obiektów V2 (stworzone w Neosie od 5.2), obiekty V1 (bez podziału na logikę i interfejs), będą działać po staremu. W Neosie od 5.2 nie da się stworzyć obiektu V1 lecz można uruchamiać stare kiedyś utworzone projekty
Drukowanie plików PDF¶
Do drukowania pliku PDF po stronie klienta VCL lub po stronie serwera należy użyć metody PrintPdfToPrinterAsync.
Przyjmuje ona 3 parametry:
- ścieżka do pliku PDF, który chcemy wydrukować (filepath),
- nazwa drukarki (printername)
- flaga, dzięki której wybieramy czy drukować po stronie serwera czy klienta (serverside). Flaga ta domyślnie jest ustaiona na false, czyli domyślnie drukowanie odbywa się po stronie klienta VCL. Jeśli chcemy by drukowanie odbywało się po stronie serwera to ustawiamy na true.
Przykład użycia:
Neos.ProReport.PDFPrinter.ProReport.PrintPdfToPrinterAsync(@"C:\testowy.pdf","Drukarka1", false);
testowy.pdf przy użyciu drukarki "Drukarka1" i drukowanie odbywa się po stronie klienta.
[1]: GhostXPS się jedynie pobiera i kopiuje pliki
Drukowanie dużych plików PDF¶
Podczas generowania faktur z dużą ilością pozycji (takich, które mają kilkadziesiąt/kilkaset stron) do pliku pdf możemy napotkać następujące problemy: - powstaje plik o rozmiarze 0 kb, a sam wydruk kończy się błędem - podczas drukowania maszyna jest drastycznie obciążona, a sam wydruk trwa kilka/kilkanaście minut - wydruk pliku kończy się błędami w usłudze PrintService (logi dostępne z poziomu dziennika zdarzeń), dotyczą one pliku splwow64.exe i problemów z pamięcią - w wyjątkowych sytuacja mogą występować restarty maszyny, na której jest uruchomiony serwer
Na podstawie analizy kilku przypadków doszliśmy do wniosku, że problemem może być standardowa drukarka Microsoft Print to PDF. Zauważyliśmy, że jest wolniejsza niż komercyjne rozwiązania dostępne na rynku oraz że sposób jej działania powoduje powszechnie znane problemy. Po przeanalizowaniu potrzeb i konsultacji w firmie, w przypadku wystąpienie wyżej opisanych problemów, proponujemy przekierować generowanie plików na drukarkę Bullzip PDF (https://www.bullzip.com/products/pdf/info.php). Niestety to rozwiązanie nie jest darmowe do zastosowania komercyjnego. Tego typu drukarka została uruchomiona u klienta RARPOL i ABAKUS, w razie pytań zalecamy kontakt z zespołami, które opiekują się tymi klientami.
Przykładowa konfiguracja drukarki BullZip
[Printers]
PDFBullZip:WinName=Bullzip PDF Printer
PDFBullZip:PDFPath=c:\PDF\
PDFBullZip:PDFType=Bullzip
Printer0:Name=PDFBullZip
BullzipTimeout=180 #czas wyrażony w sekundach, po jakim aplikacja przestaje oczekiwać na wydruk
Czeste pytania i odpowiedzi dotyczące ProReporta i mechanizmu wydruków do PDF.¶
Proreport¶
Komunikaty o braku pól¶
problem: Operator dostaje komunikat o braku kolumny w źródle danych wydruku w proraporcie.
rozwiązanie: Rozpoczynamy od weryfikacji definicji wydruku, na środowisku developerskim, zgodnym z wersją zainstalowaną u klienta. Jeśli definicja jest dostępna poprawnie. Należy zweryfikować środowisko testowe u klienta, zwykle lastday/daily, które jest odbijane od środowiska produkcyjnego. Jeśli na nim nie występuje błąd i możliwe jest zrealizowanie wydruku na produkcji bez konsekwencji w procesach klienta, powtarzamy próbę na produkcji. Jeśli tam nie występuje błąd, kontaktujemy się z operatorem który błąd zarejestrował. Jeśli na środowisku operatora, błąd występuje, należy sprawdzić czy plik params\esystem\esystem.rpt i report\esystem.rpt u operatora jest identyczny z tym na środowisku produkcyjnym. Jeśli nie, należy sprawdzić, czy operator nie ma ograniczonych uprawnień do lokalizacji gdzie zapisywana jest aplikacja przez starter. Jeśli to nie pomoże, można usunąć całe środowisko lokalne operatora i pobrać ponownie starterem całe środowisko, powinno to rozwiązać rozbieżność. Jeśli u klienta jest wykorzystywany starter, zdarza się, że operatorzy zakładają sktrót do aplikacji a nie do startera i w ten sposób uruchamiają aplikację, co powoduje, że aplikacja końcowa nie jest aktualizowana. Jeśli błąd rozbieżności źródła danych z wydrukiem potwierdzi się na etapie środowiska developerskiego, należy ustalić w jakim temacie następowało dodanie tego pola i odnaleźć zmiany na gicie/u developera wykonującego temat lub odtworzyć pole na podstawie opisu ze zgłoszenia i uzupełnić definicję wydruku.
Problemy z datą %df()%¶
problem: Operator otrzymuje komunikat o niepoprawnej dacie “is not a valid date”
rozwiązanie: Przyczyna jest zwykle w formacie daty w systemie. Można to rozwiązać lokalnie, zmieniając ustawienia regionalne daty u operatora, gdzie występuje problem. Jeśli komunikat pojawia się w analizach lub funkcjach parsera, można użyć formuły '%df(&ZMIENNA&)%' która przeparsowuje datę ze zmiennej do formy dopuszczalnej w wyrażeniu.
Wątki sserwer¶
zmienne kontekstowe¶
problem: Czy możemy korzystać ze zmiennych kontekstowych %% (np. %KLIENCI.REF%) w definicji raportu drukowanego przez sserwer?
rozwiązanie: Niestety nie jest dopuszczalne korzystanie ze zmiennych %% w definicji wydruku. Skończyłoby się to przypisaniem wartości z nieznanego rekordu (najczęściej pewnie pierwszego), gdyż aplikacja teneum jest inną instancją niż sserwer i znajdują się w innym konteście. Tzn. Aplikacja sserwer nie wie na którym rekordzie kontrahenta “stoi” aplikacja teneum. Aby wydrukować raport dla konkretnego rekordu należy jego refa (klucz główny) przekazać jako parametr wydruku z neosa, który zna kontekst klienta teneum, do sserwera.
długie drukowanie¶
problem: Co zrobić gdy drukowanie dokumentu do PDF trwa długo?
rozwiązanie: Na początku należy porównać czas wydruku tego samego dokumentu bezpośrednio z klienta VCL na drukarkę PDF i czas wydruku przez sserwer. Zasadniczo różnica nie powinna być większa niż kilka sekund. Jeśli wydruk przez sserwer trwa znacząco dłużej, to przyczyna może leżeć w długim czasie uruchamiania procesu sserwera. Powody tego mogą być różne. Zasadniczo proces ten został znacząco odchudzony w stosunku do startu klienta VCL. Nie są np. buforowane wszystkie ustawienia z s_appini, ale są tylko leniwie na bieżąco doczytywane potrzebne parametry. Ogólnie jednak na starcie procesu dzieje się wiele. Odpalają się różne akcje standardowe i customowe, inicjowanych jest wiele mechanizmów. Być może w sserwerze nie wszystko jest potrzebne. Dobrze jest skonsultować taką sytuację z zespołem opiekującym się technologią. Jeśli czas wydruku przez sserwer i klienta VCL są podobne, to warto porównać czas czystego wydruku do podglądu i pełen czas wydruku do PDF. Jeśli to sam czas wydruku do PDF jest problemem, to warto skorzystać z płatnej lecz niedrogiej drukarki bullzip, która jak wynika z naszych testów potrafi skrócić ten czas dwukrotnie.
Niestandardowy wydruk do pdf¶
problem: Z jakich zewnętrznych aplikacji możemy korzystać drukując raport do PDF?
rozwiązanie: Klient teneum oraz sserwer potrafią drukować do PDF korzystając z dostępnej od Windowsa XP drukarki “Microsoft XPS Document Writer” a następnie z darmowego konwertera “gxpswin”. Od wersji systemu operacyjnego Windows 10 oraz Windows server 2016 standardowo w systemie jest dostępna drukarka “Microsoft Print to PDF”. Oba rozwiązania są dostępne “z pudełka”. Przed wersją 4.6 klient VCL wspierał w pewnym stopniu drukarkę PDFCreator, niemniej od roku 2017 mechanizmy te nie są przez nas utrzymywane i docierają głosy, że z najnowszymi drukarkami tej serii nasza aplikacja może mieć problemy we współpracy. W dalszym ciągu utrzymujemy kompatybilność z drukarką “Bullzip PDF Printer”, która lepiej radzi sobie z dużymi dokumentami, większymi niż 100 stron, oraz drukuje szybciej niż standardowa drukarka “Microsoft Print to PDF”.
parametry sserwera¶
problem: W jaki sposób możemy skonfigurować sserwer?
rozwiązanie: Sserwer konfigurujemy w pliku smd z którego korzysta neos. Odpowiednie klucze powinny znaleźć się w sekcji Neos.SServer. Ścieżkę, w której znajduje się katalog z sserwerem definiujemy kluczem "SServerPath" o domyślnej wartości: "tools\sserver\sserver3.exe". Alias bazy danych zawiera klucz "DatabaseAlias" o domyślnej wartości “esystem”. Do uwierzytelniania służą klucze: "SServerUserName" oraz "SServerUserPass". Poprzez klucz "Timeout" o domyślnej wartości 5 (minut) możemy również sterować maksymalnym czasem jaki neos daje procesowi sserwera na wykonanie operacji. Jeśli do tego czasu proces sserwera nie zamknie się sam, to zostanie zamknięty przez neosa, który uzna, że operacja zakończyła się niepowodzeniem i wywoła metodę OnError.
ograniczenia schedulera¶
problem: Gdy uruchamiam z neosa wydruk do pdf przy pomocy sserwera z aplikacji - klienta teneum, to działa, a jak ten sam wydruk jest uruchamiany z reguły schedulera to nie działa. Dlaczego?
rozwiązanie: Przyczyn może być wiele. Pierwszą rzeczą, którą należy sprawdzić jest to, czy reguła schedulerowa i klient teneum nie działają na różnych neosach oraz czy jeden nie jest odpalony np. jako usługa, a drugi jako aplikacja. Jeżeli tak, to być może logują się na innych użytkowników systemowych, co może powodować różnice uprawnień, ścieżki systemowej, drukarek systemowych itp. Jeśli aplikacja i reguła schedulerowa działają na jednym neosie, to należy pamiętać, że wątek obsługujący aplikację działa w kontekście zalogowanego do niej użytkownika, a reguła schedulerowa bez kontekstu. Powoduje to różnice w wartościach zmiennych globalnych jednej i drugiej instancji. Reguła schedulerowa wykona poprawnie tylko wydruk nie odwołujący się do wartości zmiennych globalnych ani w swoim ciele, ani w ciele metod z których korzysta, ani w procedurach bazodanowych z których korzysta, ani w szablonie raportu. Wydruk wywoływany przez regułę schedulerową nie może korzystać np. z &AKTUOPERATOR&. Kolejna rzecz o której należy pamiętać, to że reguła schedulerowa nie może korzystać z bieżącego kontekstu aplikacji/kartoteki. Tzn nie jest dopuszczalne korzystanie ze zmiennych %% w definicji wydruku np. %NAGFAK.REF%). Skończyłoby się to przypisaniem wartości z nieznanego rekordu (najczęściej pewnie pierwszego). Dotyczy to nie tylko wydruków przez sserwer, ale dowolnych wydruków, czy akcji.
Wydruki do pdfów¶
drukowanie serii wydruków¶
problem:: Brak plików pomimo zakończenia generowania wydruków do PDF rozwiązanie: Czasami przy bardziej skomplikowanych przypadkach wykorzystywania wydruku do PDF przez sserver z generowaniem wielu plików w jednym wywołaniu może pojawić się problem. Może zdarzyć się tak, że pomimo wywołania metody z pluginu odpowiedzialnej za generowanie PDF, pliki nie pojawią się w docelowej lokalizacji. Spowodowane jest to asynchronicznym generowaniem plików, kolejka wydruków nie jest prawidłowo obsługiwana i niektóre wydruki mogą zostać pominięte. W takich przypadkach najlepszym rozwiązaniem będzie wykorzystanie metody PrintPDF z Neos.ProReport.PDFPrinter.ProReport. W parametrach tej metody wystarczy podać PrintAction aktualnie generowanego wydruku oraz wartość bool - true(domyślnie jest ustawione false - wydruk jest wywoływany asynchronicznie).
niepoprawne zakończenie¶
problem: Sserver zakończył się błędem
rozwiązanie: Najczęstszym powodem takiego komunikatu są nieprawidłowo wyrównane pliki wydruków lub definicji. Należy zweryfikować pliki z folderów report i params, ponieważ powinny one być takie same jak w aplikacji Teneum. Jeżeli po wyrównaniu nadal występują błędy to dokładniejszy komunikat błędu będzie zapisany w logu: \tools\sserver\sqlerror.log
kompilacja starych metod neosowych drukujących do PDF¶
problem: mam użyte w kodzie metody drukującej do pdf #if NEOS_PROREPORT_PDFPRINTER i neos nie wchodzi do tej dyrektywy warunkowej.
rozwiązanie:do wersji neosa 6.0 kod obsługujący wydruki do pdf przez sserwer znajdował się w pluginach, które definiowały dyrektywę NEOS_PROREPORT_PDFPRINTER. Od wersji 6.0 kod obsługujący wydruki znajduje się w modułach, które są zawsze dołączane do neosa, więc dyrektywa NEOS_PROREPORT_PDFPRINTER przestała mieć sens, dlatego należy usunąć jej sprawdzenia z kodu metod neosowych.
ustawianie foledu docelowego wydruku¶
problem: Jak mogę ustawić folder docelowy, gdzie zapisze się plik wydrukowany z neossa przez sserwer?. rozwiązanie:Folder docelowy do którego zapisze się plik wygenerowany przez sserwer można ustawić w pliku smd neosa w sekcji Neos.SServer.PReport.PDF w kluczu DefaultOutputPath. Domyślnie jest to ścieżka względna “.\output”.
włączenie oczekiwania na zakończenie wydruku¶
problem: Czy da się tak skonfigurować moduł wydruków do PDF z neosa, aby wywoływał metodę na sukces (po zakończeniu wydruku) dopiero gdy zakończy się ostatecznie drukowanie do pliku PDF łącznie z utworzeniem pełnego pliku?
rozwiązanie: Tak, steruje tym parametr, który można ustawić w pliku smd neosa w sekcji Neos.SServer.PReport.PDF w kluczu WaitForUnlockOutputFile. Przyjmuje wartości “yes” i “no”. “no” jest wartością domyślną. Wybranie “yes” spowoduje, że maksymalnie przez 30 sekund co 100 milisekund neos będzie próbował otworzyć plik na wyłączność. Gdy taka próba powiedzie się, to zostanie natychmiast wywołana metoda OnSuccess. Jeśli po 30s nie uda się otworzyć pliku to metoda ONSuccess i tak zostanie wywołana. Analogiczny mechanizm jest zaimplementowany po stronie sserwera, który czeka maksymalnie ponad 9s na możliwość wyłącznego otwarcia wynikowego pliku. Jeśli się nie uda, to proces idzie dalej.
sterowanie wielkością pliku wynikowego¶
problem: Plik pdf generowany przez moduł wydruków do pdf z neosa jest za duży?
rozwiązanie: Problemem może być załączanie zdjęć/obrazków o dużej rozdzielczości. Obrazki należy skalować, aby zmniejszyć wielkość dokumentu. Można użyć konwerterów wykorzystanych w temacie https://jira.sente.pl/browse/TSU-1638 . Jeśli problemem nie są obrazki to innym sposobem na zmniejszenie dokumentu jest sprawdzenie i użycie innych drukarek do PDF - np. Bullzip lub PDFCreator.
problem z wyświetlaniem obrazków¶
problem: Załączone obrazki nie chcą się poprawnie wyświetlać w pliku PDF? rozwiązanie: Problemem może być załączanie zdjęć/obrazków w niewłaściwej przestrzeni kolorów.Np. CMYK. Obrazki należy przekonwertować do bardziej przyjaznego formatu - sRGB. Można użyć konwerterów użytych w temacie https://jira.sente.pl/browse/TSU-1638 i opisanych tu: https://wiki.sente.pl/dokuwiki/doku.php?id=dro:fiximage&s[]=konwersja&s[]=plik