Printer.Canvas - błędy druku na drukarce rzeczywistej

Printer.Canvas - błędy druku na drukarce rzeczywistej
IN
  • Rejestracja:około 16 lat
  • Ostatnio:ponad rok
0

Witam.
Mam takie pytanie może ktoś miał podobny przypadek. Drukuje w Delphi 2007 tabelkę z wykresem.
Przed drukiem do Canvas drukarki pobieram info o marginesach i wielkości strony w stylu drukOfsX: 100; drukOfsY: 100; drukSzer: 4760; drukWys: 6814;
Z rzut danych do Bmp.Canvas działa bez zarzutu. To samo z wydrukiem do PDF nie ma problemu.
Natomiast na drukarce rzeczywistej zwęża mi pole drukowania i drukuje wąski pasek przez środek strony.
Ta sama procedura drukuje do PDF i na drukarkę a mimo to są takie "kwiatki".

Wie może ktoś coś na ten temat? Bo brakuje mi pomysłów
aaa inne dokumenty np z Worda drukowane są oczywiście bez błędów.

edytowany 3x, ostatnio: Integers
babubabu
  • Rejestracja:około 13 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Łódź
  • Postów:648
1

Masz błąd w 186 linii.

abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
0

a jesteś pewny, że drukarka ma 600DPI?
BTW czy przez wydruk rozumiesz narysowanie na niej dużej bitmapy czy rysujesz wprost na płótnie drukarki?


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber
IN
  • Rejestracja:około 16 lat
  • Ostatnio:ponad rok
0

Pobieram informacje o rozmiarze strony, wyliczam pozycje marginesów drukarki, rysuję na Printer.Canvas ramkę za Rantagle tuż przy brzegach marginesów.
Poniżej procedura do wyboru drukarki.

Kopiuj
procedure Example_PrintCvS2_Printer();
var _PCvS2: TkPrintCvS2;
begin

  frmCvS2.PrintDialog.Copies:= 1;
  if not frmCvS2.PrintDialog.Execute then exit;
  Printer.Title:='Wydruk';


  Printer.BeginDoc;


  _PCvS2.Init(Printer);                                 // pobranie wielkości pola wydruku i marginesach
  _PCvS2.SetCanvasSize(Printer, cA4);          

  SetDane(Printer.Canvas, _PCvS2);              // wrzucenie danych na Canvas
  MDrawTest(Printer.Canvas,1,_PCvS2.Canvpx,_PCvS2.Zakrpx);             // oznaczenie pozostałego wolnego miejsca na stronie

  Printer.EndDoc;

                                                                 // To samo co wyżej ale generowanie podglądu na BMP
  _PCvS2.Init(nil);
  _PCvS2.SetCanvasSize(nil, cA4);

  SetDane(_PCvS2.BmpPg.Canvas, _PCvS2);
  MDrawTest(_PCvS2.BmpPg.Canvas,1,_PCvS2.Canvpx,_PCvS2.Zakrpx);

                                                                // Podgląd na Image
  MDraw(frmCvS2.Image, _PCvS2.BmpPg,Trunc(cA4.Width*cPxLmm),Trunc(cA4.Height*cPxLmm));

  FreeAndNil(_PCvS2);
end;

Ok poszukam coś na temat tych 600dpi może coś pominąłem, ale dla PDFa mam:
drukOfsX: 0; drukOfsY: 0;
drukSzer: 4958; drukWys: 7016;
dpi.y: 600; dpi.x: 600;

Lewy: 0;
Gorny: 0;
Prawy: 0;
Dolny: 1;

i dla drukarki:

drukOfsX: 100; drukOfsY: 100;
drukSzer: 4760; drukWys: 6814;
dpi.y: 600; dpi.x: 600;

Lewy: 100;
Gorny: 100;
Prawy: 100;
Dolny: 100;

info o rozdzielczości pobierane za pomocą
// rozdzielczość:

Kopiuj
  dpi.y := GetDeviceCaps(aPrinter.Handle, LOGPIXELSY);
  dpi.x := GetDeviceCaps(aPrinter.Handle, LOGPIXELSX);

Przejrzałem kilka przykładów na temat druku i nie wiem co jest grane.

edytowany 3x, ostatnio: Integers
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
1

pytanie podstawowe - dzieje się tak na jednej konkretnej drukarce czy na różnych (wirtualne się nie liczą). Miałem już przypadki, że drukowały się cuda z delphi (np. word drukował poprawnie) na jednej drukarce (chyba jakiś laser HP) i pomogła aktualizacja sterowników do niej


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
IN
  • Rejestracja:około 16 lat
  • Ostatnio:ponad rok
0

Sprawdziłem na 3 drukarkach znajomych, jednak coś jest nie tak z marginesami i zwęża je przy drukowaniu kartek. Nie mam pomysłu co z tym zrobić. Może jest jakiś komponent w zastępstwie? a propos komponentów to w Delphi 2007 by coś szwankowało?

edytowany 1x, ostatnio: Integers
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:8 miesięcy
  • Postów:6610
1

możesz spróbować jeszcze najpierw narysować na wmf a potem go wydrukować. Albo narysować na bitmapie i potem wydrukować bitmapę. Jednak dużą bitmapę drukuje się trochę inaczej - np. tak


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
edytowany 1x, ostatnio: abrakadaber
IN
  • Rejestracja:około 16 lat
  • Ostatnio:ponad rok
0

Czyli wyliczyć marginesy na sztywno z jakimś zapasem. Jest to jakiś sposób. Dam znać jak przetestuje na kilku drukarkach.

Rekman
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 10 lat
  • Postów:148
2

Jak ustalaasz proporcje wydruku. Ekran ma inną rozdzielczość niż drukarka.Raczej nie można tego ustalać na sztywno.

IN
  • Rejestracja:około 16 lat
  • Ostatnio:ponad rok
0

W przykładzie, który podesłał @abrakadaber jest, że marginesy są wyliczane jako np Lewy = 12% szerokości. Ale po przejrzeniu doszedłem do wniosku jest tam też inny sposób wklejania obrazu na Canvas. Jednak sposób po świętach dopiero przetestuję bo mi drukarka padła. Złośliwość rzeczy martwych

Rekman
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 10 lat
  • Postów:148
1

Jeżeli masz MS Office'a to testuj na Microsoft Office Document Image Writer.

IN
  • Rejestracja:około 16 lat
  • Ostatnio:ponad rok
0

@Rekman dzięki za podpowiedź, nie mam niestety w swoim pakiecie tego, może się uda mi się znaleźć jakiś download.

Edit.
Na drukarce pod WinXP drukuje jak trzeba, sprawdzę jeszcze na innych drukarkach. Do admina jak możesz to w innych postach o drukarkach daj link do tej procedury
najważniejsze jest:
w podanym linku

Kopiuj
PROCEDURE PrintBitmap(Canvas:  TCanvas; DestRect:  TRect;  Bitmap:  TBitmap);

bo to sprawdzone i działa.
Dziękuję wszystkim za pomoc i wskazówki. Hucznego Sylwestra i szczęśliwego Nowego Roku

Edit.
Działa na WinXp i na Win7.

dodanie znacznika <code class="delphi"> - fp

Edit.
Przepraszam Furious Programming po prostu myślałem że podanie samej deklaracji procedury nie nadaje się na formatowanie.
Co do problemu drukowania .. to zastanawiam się czy na błędny odczyt nie ma wpływu fakt że procedury do odczytu umieściłem w klasie, może gubi gdzieś wskaźnik albo coś, spróbuję wstawić same procedury bez klasy i zobaczę jak to zadziała.

edytowany 8x, ostatnio: Integers
flowCRANE
Po raz ostatni przypominam o wstawianiu kodu w znaczniki kolorujące składnię; Kolejne posty z kodem bez tych znaczników będą usuwane...
flowCRANE
Nie przepraszaj mnie, tylko pamiętaj o tych znacznikach; Każdy, nawet jednolinijkowy kod nadaje się do znaczników, które notorycznie pomijasz, przez co Twoje posty wyglądają jak zwykły tekst; Dopiero przy czytaniu wychodzi na jaw, że podane są jakieś instrukcje, przez co post jest mało czytelny; Po prostu pamiętaj o tym, by użytkownikom przedstawiać informacje w sposób sformatowany;
flowCRANE
Aha, jeśli potrzebujsz kogoś przywołać to postaw znak@ przed nazwę użytkownika, a on dostanie o tym powiadomienie - np. @Integers; Nie musisz ręcznie wklepywać linków :)
IN
używałem @ ale tym razem mi nie wyskoczyło, może jakiś chwilowy błąd przeglądarki, ale o wysyłaniu powiadomień nie wiedziałem.
flowCRANE
Nazwy użytkowników składające się z kliku słów muszą być objęte klamrami, np. @{nazwa użytkownika}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.