Do you own a Debenu Quick PDF Library version 7, 8, 9, 10, 11, 12, 13 or iSEDQuickPDF license? Upgrade to Debenu Quick PDF Library 14 today!
![]() |
Lazarus: Aspect Ratio is off |
Post Reply ![]() |
Author | |
RedOctober2018 ![]() Team Player ![]() ![]() Joined: 22 Jun 18 Location: West Status: Offline Points: 25 |
![]() ![]() ![]() ![]() ![]() Posted: 22 Jun 19 at 4:43PM |
I have successfully installed QuickPDF 10.13 Active X in Lazarus 1.8.4. I am able to display .Pdf documents. Everything I need to do is "mostly" working, however I have an annoying problem. The displayed aspect ratio is not correct. The displayed image of the Pdf page is always a little fuzzy, unlike when the same .Pdf file is displayed in Adobe or Nuance, which is always clear.
Also, when I display in zooms above 100%, the right edge is cut off. As I zoom higher and higher (like 400% for example, more and more of the right edge is cut off). Unlike in the Delphi version, the ActiveX version of QuickPDF does not have the very convenient and simple "LoadFromStream" which takes care of all the aspect ratio, zoom, and rotation etc. In the ActiveX version I have to do all this manually. Here is the code I am using. Can some generous person correct it so I can get nice clear .Pdf renderings, with the full image showing regardless of rotation or zoom?
<CODE> function RenderPDFPageAX(const fnm: String; const img: TImage; const pg: Integer; var pc: Integer; const zm: Integer; var err_msg: String): Boolean; var vch: Variant; // Variant containing the Canvas Handle bmp: TBitmap; dpi, pg_rt, zdvi: Integer; zdvd: Double; wdtd, hgtd, wdtn, hgtn, wdts, hgts: Double; wdti, hgti: Integer; rnd_md: TFPURoundingMode; sbx: TScrollBox; obj: TObject; tmp_fnm: String; begin Result := True; err_msg := ''; sbx := nil; ReleasePdfImg(img); obj := img.Parent; if not Assigned(obj) then Exit; if (obj is TScrollBox) then sbx := (obj as TScrollBox); if not Assigned(sbx) then Exit; sbx.HorzScrollBar.Position := 0; sbx.VertScrollBar.Position := 0; img.AutoSize := True; img.Left := 0; img.Top := 0; img.Visible := True; bmp := nil; try if Assigned(GlobalVars.QwkPdf.axl) then begin inc(GlobalVars.RenderID); tmp_fnm := GlobalVars.AppProps.pdf_tmp_fdr + IntToStr(GlobalVars.RenderID) + '.dat'; GlobalVars.QwkPdf.axl.OleServer.SetTempFile(tmp_fnm); Result := (GlobalVars.QwkPdf.axl.OleServer.LoadFromFile(fnm, '') = 1); if Result then begin pc := GlobalVars.QwkPdf.axl.OleServer.PageCount; GlobalVars.QwkPdf.axl.OleServer.SelectPage(pg); pg_rt := GlobalVars.QwkPdf.axl.OleServer.PageRotation; // Page Points wdtd := GlobalVars.QwkPdf.axl.OleServer.PageWidth; hgtd := GlobalVars.QwkPdf.axl.OleServer.PageHeight; // Page Points to Inches wdtn := wdtd / 72; hgtn := hgtd / 72; // Inches to Screen pixels wdts := wdtn * GlobalVars.QwkPdf.sppi; hgts := hgtn * GlobalVars.QwkPdf.sppi; rnd_md := Math.GetRoundMode; Math.SetRoundMode(rmUp); wdti := Round(wdts); hgti := Round(hgts); Math.SetRoundMode(rnd_md); bmp := TBitmap.Create; bmp.Canvas.Brush.Color := clWhite; if (pg_rt = 0) or (pg_rt = 180) then begin bmp.Width := wdti; bmp.Height := hgti; end else begin bmp.Width := hgti; bmp.Height := wdti; end; // Adjust for Zoom dpi := (zm * GlobalVars.QwkPdf.sppi) div 100; if not (zm = 100) then begin if (zm > 100) then begin zdvi := (zm div 100); bmp.Width := bmp.Width * zdvi; bmp.Height := bmp.Height * zdvi; end; if (zm < 100) then begin zdvd := (zm / 100); bmp.Width := Trunc(bmp.Width * zdvd); bmp.Height := Trunc(bmp.Height * zdvd); end; end; bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height)); img.Picture.Assign(bmp); vch := bmp.Canvas.Handle; end else begin err_msg := 'Unable to load PDF Viewer from file: ' + fnm + #13 + 'ErrorCode: ' + IntToStr(GlobalVars.QwkPdf.axl.OleServer.LastErrorCode); Exit; end; Result := (GlobalVars.QwkPdf.axl.OleServer.RenderPageToDC(dpi, pg, vch) = 1); if not Result then begin err_msg := 'Unable to render image from QuickPDF ActiveX' + #13 + GlobalVars.QwkPdf.axl.OleServer.LastRenderError; Exit; end; end; finally bmp.Free; end; end; </CODE> |
|
![]() |
|
RedOctober2018 ![]() Team Player ![]() ![]() Joined: 22 Jun 18 Location: West Status: Offline Points: 25 |
![]() ![]() ![]() ![]() ![]() |
For those who are interested, here is the corrected code. I set the color of the BitMap to blue, so you can tell if the document is contained within an exact same sized image as the BitMap, or if the BitMap is a tiny bit bigger. This code fixes the problem I had above, and appears to make an exact same sized BitMap (which is perfect) or one that is just a few pixels larger (which is ok). In any case, the document is no longer being cut off, and rotation works as well.
<CODE> function RenderPDFPageAX(const fnm: String; const img: TImage; const pg: Integer; var pc: Integer; const zm: Integer; var err_msg: String): Boolean; var vch: Variant; // Variant containing the Canvas Handle bmp: TBitmap; dpi, pg_rt, zdvi: Integer; zdvd: Double; wdtd, hgtd, wdtn, hgtn, wdts, hgts: Double; wdti, hgti: Integer; rnd_md: TFPURoundingMode; sbx: TScrollBox; obj: TObject; tmp_fnm: String; begin Result := True; err_msg := ''; sbx := nil; ReleasePdfImg(img); obj := img.Parent; if not Assigned(obj) then Exit; if (obj is TScrollBox) then sbx := (obj as TScrollBox); if not Assigned(sbx) then Exit; sbx.HorzScrollBar.Position := 0; sbx.VertScrollBar.Position := 0; img.AutoSize := True; img.Left := 0; img.Top := 0; img.Visible := True; bmp := nil; try if Assigned(GlobalVars.QwkPdf.axl) then begin inc(GlobalVars.RenderID); tmp_fnm := GlobalVars.AppProps.pdf_tmp_fdr + IntToStr(GlobalVars.RenderID) + '.dat'; GlobalVars.QwkPdf.axl.OleServer.SetTempFile(tmp_fnm); Result := (GlobalVars.QwkPdf.axl.OleServer.LoadFromFile(fnm, '') = 1); if Result then begin with GlobalVars.QwkPdf.axl.OleServer do begin SetMeasurementUnits(2); // 2 = Inches. SetGDIPlusOptions(0, 1); SetGDIPlusOptions(1, 1); SetGDIPlusOptions(2, 1); SetGDIPlusOptions(3, 1); SetGDIPlusOptions(10, 2); SetGDIPlusOptions(11, 2); end; pc := GlobalVars.QwkPdf.axl.OleServer.PageCount; GlobalVars.QwkPdf.axl.OleServer.SelectPage(pg); pg_rt := GlobalVars.QwkPdf.axl.OleServer.PageRotation; // Page Size in inches wdtd := GlobalVars.QwkPdf.axl.OleServer.PageWidth; hgtd := GlobalVars.QwkPdf.axl.OleServer.PageHeight; bmp := TBitmap.Create; bmp.Canvas.Brush.Color := clBlue; //clWhite; // Inches to Screen pixels wdti := Trunc(wdtd * GlobalVars.QwkPdf.sppi); hgti := Trunc(hgtd * GlobalVars.QwkPdf.sppi); if (pg_rt = 0) or (pg_rt = 180) then begin bmp.Width := wdti; bmp.Height := hgti; end else begin bmp.Width := hgti; bmp.Height := wdti; end; // Adjust for Zoom zdvd := 1; if not (zm = 100) then begin if (zm > 100) then begin zdvd := (zm div 100); end; if (zm < 100) then begin zdvd := (zm / 100); end; end; wdti := Trunc(bmp.Width * zdvd); hgti := Trunc(bmp.Height * zdvd); bmp.Width := wdti; bmp.Height := hgti; bmp.Canvas.FillRect(Rect(0, 0, bmp.Width, bmp.Height)); img.Picture.Assign(bmp); vch := bmp.Canvas.Handle; end else begin err_msg := 'Unable to load PDF Viewer from file: ' + fnm + #13 + 'ErrorCode: ' + IntToStr(GlobalVars.QwkPdf.axl.OleServer.LastErrorCode); Exit; end; Result := (GlobalVars.QwkPdf.axl.OleServer.RenderPageToDC(Trunc(GlobalVars.QwkPdf.sppi * zdvd), pg, vch) = 1); if not Result then begin err_msg := 'Unable to render image from QuickPDF ActiveX' + #13 + GlobalVars.QwkPdf.axl.OleServer.LastRenderError; Exit; end; end; finally bmp.Free; end; end; </CODE>
Edited by RedOctober2018 - 30 Jun 19 at 10:23PM |
|
![]() |
|
RedOctober2018 ![]() Team Player ![]() ![]() Joined: 22 Jun 18 Location: West Status: Offline Points: 25 |
![]() ![]() ![]() ![]() ![]() |
procedure ReleasePdfImg(const img: TImage); begin if not Assigned(img) then Exit; img.Picture.Bitmap := nil; img.Picture.Graphic := nil; end; |
|
![]() |
Post Reply ![]() |
|
Tweet
|
Forum Jump | Forum Permissions ![]() You cannot post new topics in this forum You cannot reply to topics in this forum You cannot delete your posts in this forum You cannot edit your posts in this forum You cannot create polls in this forum You cannot vote in polls in this forum |
Copyright © 2017 Debenu. Debenu Quick PDF Library is a PDF SDK. All rights reserved. About — Contact — Blog — Support — Online Store