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

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.

1

Masz błąd w 186 linii.

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?

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.

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ść:

  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.

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

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?

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

0

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

2

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

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

1

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

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

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.

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