Generowanie PDF

0

Witam serdecznie. Mam pytanie (zapewne proste). W swoim prostym programie do obsługi sprzedaży chciałbym dołożyć generowanie pliku PDF z Quickreportu. W sieci znalazłem coś takiego:

procedure TFrmPrintPreview.ExportToPDF(Filename: String);
var
  aPDF : TQRPDFDocumentFilter;
begin
  aPDF := TQRPDFDocumentFilter.Create(Filename);
  aPDF.FontHandling := fhAutoEmbed;
  QRPreview.QRPrinter.ExportToFilter(aPDF);
  aPDF.Free;
end;

Problem w tym, że nie mam u siebie takiego komponentu. Skąd go można zdobyć. Mój Delphi to Delphi 7 a wersja QuickReport to 3.0.9. Może jakieś inne rozwiązanie. W tej chwili za pomocą quickreport1.preview podglądam na ekranie, za pomocą quickreport1.print drukuję, a chciałym mieć możliwość wysłania pliku mailem. Liczę na serdeczną pomoc. Sławek

0

Jakiej bazy używasz?

0

Korzystam z dBase for Windows

Jakie znaczenie ma rodzaj bazy danych? Chodzi mi o brak u mnie unit-u QRPDFFilt.pas i nie wiem co zrobić. Może ktoś niedouczonemu pomoże???

Tak mi się przynajmniej wydaje. Jest w sieci wprawdzie źródło tego unitu, ale z kolei zawiera inne usesy, których nie mam..http://read.pudn.com/downloads159/sourcecode/delphi_control/710653/quickrpt/qrpdffilt.pas__.htm

Ewentualnie miałbym inne pytanie. Jak pominąć okno dialogowe podawania nazwy pliku przy wyborze drukarki wirtualnej Microsoft Print To PDF. Chodzi o to, abym przyjął bez okna swoją nazwę z wnętrza programu

1

na stackoverflow jest takie rozwiązanie i działa:

var
  DeviceMode: THandle;
  Device, Driver, Port: array[0..80] of Char;
begin
  Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft Print to PDF');
  Printer.GetPrinter(Device, Driver, Port, DeviceMode);
  Printer.SetPrinter(Device, Driver, 'C:\Temp\Test.pdf', 0);

  Printer.BeginDoc;
  Printer.Canvas.TextOut(100, 100, 'Test');
  Printer.EndDoc;
end;
0

Dziękuję serdecznie. Sprawdzę i dam znać.

2

Hardkodowanie nazwy drukarki nie jest dobrym pomysłem – w moim systemie takiej drukarki nie ma. ;)

Wiem że to tylko przykład, ale w kodzie produkcyjnym pasowałoby dokonać enumeracji urządzeń i wybrania tej, która spełnia oczekiwania. W razie czego, można skorzystać z funkcji EnumPrinters do utworzenia listy drukarek, a później jakimś Posem poszukać tej, która umożliwia druk do PDF.

Edit: WinAPI niepotrzebne – są do tego wysokopoziomowe klasy.

0

Niestety nie zapisałem w ten sposób pliku. Okno się nie pokazuje, ale pliku nie ma. Żadnego błędu nie zgłasza.

1
furious programming napisał(a):

Hardkodowanie nazwy drukarki nie jest dobrym pomysłem – w moim systemie takiej drukarki nie ma. ;)

Ale skoro to jest standardowa drukarka zainstalowana w Windows 10 to czemu by nie zrobić w ten sposób?

Wiem że to tylko przykład, ale w kodzie produkcyjnym pasowałoby dokonać enumeracji urządzeń i wybrania tej, która spełnia oczekiwania. W razie czego, można skorzystać z funkcji EnumPrinters do utworzenia listy drukarek, a później jakimś Posem poszukać tej, która umożliwia druk do PDF.

Zdaje się ten myk nie działa z każdą drukarką PDF'ów, a tą Microsoftową. Poza tym aby przejrzeć wszystkie dostępne drukarki wystarczyłoby zapoznać się z właściwością Printer.Printers http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.Printers.TPrinter.Printers

1
Mr.YaHooo napisał(a):

Ale skoro to jest standardowa drukarka zainstalowana w Windows 10 to czemu by nie zrobić w ten sposób?

Bo na świecie są w użyciu inne wersje Windows, niż 10. ;)

1
furious programming napisał(a):

inne wersje Windows, niż 10. ;)

Jako, że Windows 8.1 jest niewypałem (oprócz 10-tki tylko on ma wsparcie jeszcze) nie interesują mnie inne wersje niż 10-tka z punktu widzenia programisty :]


A przynajmniej staram się w ten sposób postępować. Niestety nie zawsze to możliwe i życie nie to bajka, czasami trzeba aby system działał również na Windows XP.

0

@Mr.YaHooo: I to jest właśnie piękne w Lazarusie - apki w nim stworzone działają praktycznie na każdym Windowsie, zaczynając od XP. Nie wiem, czy nie dałoby się ich na starszych (typu 98 albo 2000) odpalić, ale to są takie zabytki, że nie ma nawet sensu tego sprawdzać (chyba twórcy Lazarusa piszą oficjalnie o XP, ale nie pamiętam dokładnie i nie chce mi się teraz tego sprawdzać).

W każdym razie - z jednej strony pewnie tracimy część nowości dostępnych w najnowszych okienkach, ale za to masz program, który po pierwsze pójdzie praktycznie na kazdym Windowsie, a po drugie - przy minimalnym nakładzie pracy, robisz wersję na Linuksa czy (za przeproszeniem) na Apple.

Faktem jest, że zarówno XP, jak i siódemka nie są wspierane, XP naprawdę jest w fazie zaniku, ale spotkanie gdzieś używanej na co dzień siódemki nie jest niczym niezwykłym.

0
cerrato napisał(a):

@Mr.YaHooo: I to jest właśnie piękne w Lazarusie - apki w nim stworzone działają praktycznie na każdym Windowsie, zaczynając od XP. Nie wiem, czy nie dałoby się ich na starszych (typu 98 albo 2000) odpalić, ale to są takie zabytki, że nie ma nawet sensu tego sprawdzać (chyba twórcy Lazarusa piszą oficjalnie o XP, ale nie pamiętam dokładnie i nie chce mi się teraz tego sprawdzać).

Tak, to prawda. Swoją drogą u siebie w pracy korzystamy ze starszego C++ Builder'a 2009 i tu programy działają bez problemów na Windows XP. Pamiętam kiedyś, że próbowałem uruchomić pod Windows 2000 i nawet się udało. Potem nie testowałem już. Taka jest właściwość natywnych aplikacji jakie tworzy Lazarus/Delphi/C++ Builder.

cerrato napisał(a):

W każdym razie - z jednej strony pewnie tracimy część nowości dostępnych w najnowszych okienkach, ale za to masz program, który po pierwsze pójdzie praktycznie na kazdym Windowsie, a po drugie - przy minimalnym nakładzie pracy, robisz wersję na Linuksa czy (za przeproszeniem) na Apple.

O ile nie korzysta się z haków czy API systemowego.

cerrato napisał(a):

Faktem jest, że zarówno XP, jak i siódemka nie są wspierane, XP naprawdę jest w fazie zaniku, ale spotkanie gdzieś używanej na co dzień siódemki nie jest niczym niezwykłym.

Ogólnie to moim zdaniem 7-ka jest do tej pory najlepszym systemem jaki wyszedł. Windows 10 potrafi płatać figle i okazuje się, że pewna aktualizacja Windows'a 10 spowodowała złe działanie drzewka pokazującego strukturę kodu (konkretnie to jest ono puste w trybie pokazywania struktury kodu w pliku cpp, natomiast w trybie widoku formatki hierarchia komponentów jest ładnie wyświetlana) w IDE w naszym C++ Builder 2009... I nie jest to wina danego komputera. Problem został zaobserwowany na różnych komputerach z różną konfiguracją sprzętową.

0
cerrato napisał(a):

@Mr.YaHooo: I to jest właśnie piękne w Lazarusie - apki w nim stworzone działają praktycznie na każdym Windowsie, zaczynając od XP.

Wspierana jest cała linia NT od wersji 5.0, czyli od Windows 2000.

Faktem jest, że zarówno XP, jak i siódemka nie są wspierane, XP naprawdę jest w fazie zaniku, ale spotkanie gdzieś używanej na co dzień siódemki nie jest niczym niezwykłym.

Siódemka dopiero niedawno straciła wsparcie, więc jeszcze długo będzie używana. A skoro nawet WinXP jest ciągle używany (nie, nie chodzi o mnie) i nawet jakiś czas temu odnotował wzrost popularności, to tym bardziej o Win7 nie można zapominać.

0

No i zeszło na manowce.
Jeśli zrobię tak:

Printer.PrinterIndex := Printer.Printers.IndexOf('Microsoft Print to PDF');
Printer.GetPrinter(Device, Driver, Port, DeviceMode);
Printer.SetPrinter(Device, Driver, 'C:\Test.pdf', 0);
quitreport1.print

to nie zapisuje mi raportu do pliku C:\Test.pdf lecz wyświetla okno dialogowe do podania pliku. Jeśli będę tworzył wydruk na "piechotę" to wszystko między BeginDoc i EndCoc zostanie normalnie zapisane. Jak to rozwiązać aby do pliku skierować raport?

0

Niestety ta sztuka którą wykonujesz @Chojeś nie udała mi się. Jakiś rok temu stanąłem przed dokładnie takim samym problemem. Quick Report to taki szajs jakich mało, nie polecam nikomu pisania w tym. Nawet wbudowany eksport do pdf nie działa poprawnie i nie obsługuje wszystkich komponentów, chociażby checkboxów.

Na starcie wydruku trzeba wywoływać API systemowe do drukowania (gdzie spokojnie można podać nazwę pliku jako odpowiednie pole w strukturze), ale QR nie daje możliwości zmiany wszystkich pól przekazanej struktury DocInfo w funkcji StartDoc https://docs.microsoft.com/pl-pl/windows/win32/api/wingdi/nf-wingdi-startdoca Można to rozwiązać samemu podmieniając funkcję na własną która to uzupełni odpowiednio strukturę wskazując miejsce zapisu gotowego pliku pdf. Ktoś nawet pokusił się o napisanie do tego unitu http://flocke.vssd.de/prog/code/pascal/prt2file/ Mi się nie chciało z tym bawić, więc olałem sprawę. Może Tobie uda się to zrobić.

0

Dzięki serdeczne za informacje. Będę je przetrawiał. Zrezygnować teraz z Quickreport wiązałoby się z pisaniem niektórych rzeczy na nowo. Nie wiem, czy ja nie mam doinstalowanego, czy nie ta wersja, ale u mnie nie ma nic wbudowanego do PDF-ów. Są jakieś inne do CSV, HTML, Text. W sieci znalazłem coś takiego i podobne:

procedure TFrmPrintPreview.ExportToPDF(Filename: String);
var
  aPDF : TQRPDFDocumentFilter;
begin
  aPDF := TQRPDFDocumentFilter.Create(Filename);
  aPDF.FontHandling := fhAutoEmbed;
  QRPreview.QRPrinter.ExportToFilter(aPDF);
  aPDF.Free;
end;

i właśnie u mnie nie ma TQRPDFDocumentFilter
Używam Delphi 7, a Quickreport to 3.0.9. Może za stara wersja tego QuickkReport?

1
Chojeś napisał(a):

Zrezygnować teraz z Quickreport wiązałoby się z pisaniem niektórych rzeczy na nowo.

Zatem współczuję. U mnie w pracy jest tak samo, z tym, że używamy wersji 5

Chojeś napisał(a):

Nie wiem, czy ja nie mam doinstalowanego, czy nie ta wersja, ale u mnie nie ma nic wbudowanego do PDF-ów. Są jakieś inne do CSV, HTML, Text. W sieci znalazłem coś takiego i podobne:

Używam Delphi 7, a Quickreport to 3.0.9. Może za stara wersja tego QuickkReport?

Bardzo dawno pisałem w tak starym Delphi, ale chyba tam rzeczywiście nie było filtru eksportu do PDF. Zatem najlepiej by było abyś użył zewnętrznej biblioteki do PDF. Z tego co kojarzę, to SynPDF mogło w miarę bezboleśnie eksportować PDFy z QR.

0
Mr.YaHooo napisał(a):
Chojeś napisał(a):

Zrezygnować teraz z Quickreport wiązałoby się z pisaniem niektórych rzeczy na nowo.

Zatem współczuję. U mnie w pracy jest tak samo, z tym, że używamy wersji 5

W końcu nadejdzie czas i trzeba się będzie tego zadania podjąć. Dlaczego nie zrobić tego już teraz? ;)

1
furious programming napisał(a):

Dlaczego nie zrobić tego już teraz? ;)

Jeśli nie wiadomo dlaczego, to chodzi o $. Polityka cenowa emby jest taka, że szok. http://www.embarcadero.com.pl/sprzedaz/cennik/cbuilder.shtml

Co ciekawe aby można było łączyć się do baz danych zdalnych należy kupić wersję co najmniej Enterpise https://www.embarcadero.com/products/rad-studio/firedac

Dodatkowo Embarcadero skończyło z możliwością zakupu aktualizacji. Trzeba kupić licencję "new user". Co więcej jak się nie przedłuży po roku usługi subskrypcji na następny okres to też nie ma aktualizacji tylko trzeba kupić wersję "new user". O ile dobrze pamiętam FireDac kupuje się dodatkowo (chyba 700 Eur). Zatem trzeba wyłożyć 3999 + 700 Eur oraz jakieś sensowne narzędzie do tworzenia raportów. Więc będzie ponad 5000 Eur (netto). Do tego co roku płatna subskrypcja, inaczej za każdą nową wersją kupuj od nowa. Przy 5 programistach i małej firmie po prostu nie opłaca się ;) W taki oto sposób emba wykończy się i nie dziwię się, że ludzie od nich odchodzą. Bo nie widać tu sensownych działań, tylko rozpaczliwe żyłowanie klientów których mają, zamiast wychodzić do nowych. Pomimo, że same środowisko według mnie jest dobre, to marketingowców mają do niczego.

2
Mr.YaHooo napisał(a):

Co ciekawe aby można było łączyć się do baz danych zdalnych należy kupić wersję co najmniej Enterpise https://www.embarcadero.com/products/rad-studio/firedac

Bez przesady, myślę, że wystarczy Professional i UniDAC: https://www.devart.com/unidac/ (500$) lub darmowy zeos.

0
Paweł Dmitruk napisał(a):

wystarczy Professional i UniDAC: https://www.devart.com/unidac/ (500$) lub darmowy zeos.

Fakt, można tak zrobić. Zeosów bym nie brał. Kiedyś miałem podejście i coś nie grało mi. Do tego jeszcze narzędzie do raportowania i do 3000 EUR zejdziemy. I tak moim zdaniem za drogo. Zwłaszcza, że takiego Visuala od MS można mieć całkowicie za darmo. Wiadomo tylko, że inaczej się pisze. Jednak możliwości takie same, a i łatwiej znaleźć programistę do pracy w tym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1