AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Adobe Reader einbinden

Ein Thema von idefix2 · begonnen am 7. Mai 2015 · letzter Beitrag vom 4. Feb 2018
Antwort Antwort
Seite 2 von 3     12 3      
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#11

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 11:06
Ok, danke für den Hinweis. Für Delphi ist ja von der Programmierung her kein Unterschied, oder?
  Mit Zitat antworten Zitat
jaevencooler

Registriert seit: 8. Sep 2005
Ort: Friedrichshafen
41 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 11:08
Moin, Moin,

schon mal hier nach geschaut ?

http://www.wpcubed.com/pdf/

Ich nutze die Tools und bin recht zufrieden......


Cu Michael
Michael
Wissen ist Macht, nichts wissen macht auch nichts.
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#13

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 11:51
Ja, danke, das hab ich bei meiner Suche auch schon gefunden und angeschaut.

Wenn ich damit rechnen würde, so etwas öfters zu brauchen, dann würde ich so ein Tool in Betracht ziehen. Aber voraussichtlich brauche ich das genau EIN mal, um in EINER Anwendung insgesamt 5 Formulare zu befüllen. Dafür will ich nicht etliche hundert Euro ausgeben.
Wenn man wirklich öfters PDF bearbeiten muss, dann ist das sicher eine gute Sache, aber mit dem Ansatz, den ich jetzt gefunden habe, komme ich bestens zurecht, ohne in Komponenten zu investieren, die ich nur einmal brauche und die mir in der Folge noch meine IDE zumüllen.

Was ich nicht verstehe, ist, dass es offenbar in einer älteren Reader Version eine DLL Funktionalität gegeben hat, die es in der aktuellen Version nicht mehr gibt. Das bestärkt mich darin, um Adobe einen Bogen zu machen. Wenn ich auf Basis der Version 9 oder 10 des Readers eine Lösung prtogrammiert hätte, die mit Version 11 plötzlich überhaupt nicht mehr geht, weil die neue DLL die Funktionen nicht mehr zu verfügung stellt, dann würde ich mich wirklich ärgern.

Geändert von idefix2 ( 8. Mai 2015 um 12:07 Uhr)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#14

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 12:36
Auf der Emba Homepage gibt es eine pdf.dll und dazu einen Wrapper für Delphi. Da wären wir aber wieder bei TextOut und StretchDraw und die GUI müßte gesondert programmiert werden. Ich hab das in einem Fall mal so gemacht (Edits und CheckBoxes drübergelegt). Sieht ganz nett aus soweit, ist aber ne blöde Pixel Fummelei.
Angehängte Dateien
Dateityp: pdf EnEVExample.pdf (107,5 KB, 45x aufgerufen)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 12:39
Oder man verwendet eine Reporttool mit PDF-Export ( z.B. das gebündelte Fastreport)

oder

http://www.debenu.com/products/devel...-library-lite/
Markus Kinzler

Geändert von mkinzler ( 8. Mai 2015 um 12:57 Uhr)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#16

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 15:41
Hallo Bjoerk,

danke für den Link. Das Tool ist für meine Zwecke perfekt und wirklich denkbar einfach zu verwenden. Innerhalb von weniger als 10 Minuten hatte ich schon eine erste Testausgabe fertig, bei der ich über das Formular einen Raster mit den Koordinaten (alle 50 Pixel) gelegt habe. Einfacher geht es wirklich nicht.

Eine Anzeige des formulars am Bildschirm brauche ich gar nicht, die ausgefüllten Formulare werden abgelegt und per Mail verschickt.

Zum richtigen Positionieren der Textausgaben muss ich mich jetzt noch etwas spielen, aber das müsste ich bei jeder gewählten Variante, und mit Hilfe des Formulars mit Raster sollte das recht schnell gehen.

  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 16:17
Fein.

Wenn du magst, hier hab den Wrapper von 72 auf 96 Pixel erweitert.

http://www.delphipraxis.net/1276386-post6.html

LG
Thomas
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#18

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 20:08
Danke, ich glaube, das werde ich auch noch brauchen können.

Einen Fehler solltest du ausbessern, das Exchange(FPageWidth, FPageWidth); in SetOrientation wird nicht ganz das bringen, was man sich erwartet
Und es geht etwas kompakter:

Delphi-Quellcode:
  if (FOrientation = poPortrait) <> (FPageWidth < FPageHeight) then
      Exchange(FPageWidth, FPageHeight);

Geändert von idefix2 ( 8. Mai 2015 um 21:56 Uhr)
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#19

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 21:47
@Mkinzler
Danke übrigens dir auch für den Link - habe es mir auch angeschaut, aber die Variante, die Björk vorgeschlagen hat, ist konkurrenzlos simpel und für meine Zwecke 100% ausreichend. Die Bibliothek von Debenu.com scheint einiges mehr zu können, aber dafür wäre es damit vermutlich etwas komplizierter, die triviale Aufgabe zu lösen, die ich habe.
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#20

AW: Adobe Reader einbinden

  Alt 8. Mai 2015, 22:09
Danke, ich glaube, das werde ich auch noch brauchen können.
Einen Fehler solltest du ausbessern [..]
Kann sein. Hatte das damals so auf die Schnelle gemacht. Bevor ich aber was in meine Software einbaue schau ich für gewöhnlich nochmal drüber. Hier, wie ich es schließlich implementiert hab.

Delphi-Quellcode:
unit uPdf;

interface

uses
  Windows, SysUtils, Dialogs, Graphics, Math, ShellAPI;

type
  TDinAFormat = (DinAPortrait0, DinALandscape0,
    DinAPortrait1, DinALandscape1,
    DinAPortrait2, DinALandscape2,
    DinAPortrait3, DinALandscape3,
    DinAPortrait4, DinALandscape4);

  TDinAPage = record
  private
    FMMHeight: integer;
    FMMWidth: integer;
    FDinAFormat: TDinAFormat;
    function GetLandscape: boolean;
    procedure SetDinAFormat(const Value: TDinAFormat);
  public
    property Landscape: boolean read GetLandscape;
    property MMHeight: integer read FMMHeight;
    property MMWidth: integer read FMMWidth;
    property DinAFormat: TDinAFormat read FDinAFormat write SetDinAFormat;
  end;

  TPdf = class
  private
    FFileName: string;
    FAuthor: string;
    FTitle: string;
    FSubject: string;
    FKeywords: string;
    FCreator: string;
    FPixelsPerInch: integer;
    FAutoLaunch: boolean;
    FCanvas: TCanvas;
    FDinAPage: TDinAPage;
    function GetCanvas: TCanvas;
    function GetPageCount: integer;
    function GetPageWidth: integer;
    function GetPageHeight: integer;
    function GetPdfPageWidth: integer;
    function GetPdfPageHeight: integer;
    function GetMMWidth: double;
    function GetMMHeight: double;
    function GetDinAFormat: TDinAFormat;
    function DeviceCaps: integer;
  public
    procedure BeginDoc;
    procedure NewPage;
    procedure EndDoc;
    function MMToPixel(const MMX, MMY: double): TPoint;
    property Canvas: TCanvas read GetCanvas;
    property FileName: string read FFileName write FFileName;
    property Author: string read FAuthor write FAuthor;
    property Title: string read FTitle write FTitle;
    property Subject: string read FSubject write FSubject;
    property Keywords: string read FKeywords write FKeywords;
    property Creator: string read FCreator write FCreator;
    property PageCount: integer read GetPageCount;
    property PageWidth: integer read GetPageWidth;
    property PageHeight: integer read GetPageHeight;
    property PdfPageWidth: integer read GetPdfPageWidth;
    property PdfPageHeight: integer read GetPdfPageHeight;
    property MMWidth: double read GetMMWidth;
    property MMHeight: double read GetMMHeight;
    property AutoLaunch: boolean read FAutoLaunch write FAutoLaunch;
    property DinAFormat: TDinAFormat read GetDinAFormat;
    property PixelsPerInch: integer read FPixelsPerInch;
    constructor Create(const DinAFormat: TDinAFormat);
    destructor Destroy; override;
  end;

implementation
                          
const
  cPdfDllPixelsPerInch = 72;
  cPdfDll = 'pdf.dll';

procedure RolePDFBeginDoc(License, FileName, Title, Author, Subject, Keywords, Creator: PChar;
  PageWidth, PageHeight: integer); stdcall; external cPdfDll;

procedure RolePDFNewPage;
  stdcall; external cPdfDll;

procedure RolePDFEndDoc;
  stdcall; external cPdfDll;

function RolePDFGetDC: HDC;
  stdcall; external cPdfDll;

function RolePDFPageCount: integer;
  stdcall; external cPdfDll;

function RolePDFPageWidth: integer;
  stdcall; external cPdfDll;

function RolePDFPageHeight: integer;
  stdcall; external cPdfDll;

{ TDinAPage }

function TDinAPage.GetLandscape: boolean;
begin
  Result := FDinAFormat in [DinALandscape0, DinALandscape1, DinALandscape2,
    DinALandscape3, DinALandscape4];
end;

procedure TDinAPage.SetDinAFormat(const Value: TDinAFormat);
var
  X, Y: integer;
begin
  FDinAFormat := Value;
  case FDinAFormat of
    DinAPortrait3, DinALandscape3:
    begin
      X := 297;
      Y := 2 * 210;
    end;
    DinAPortrait2, DinALandscape2:
    begin
      X := 2 * 210;
      Y := 2 * 297;
    end;
    DinAPortrait1, DinALandscape1:
    begin
      X := 2 * 297;
      Y := 4 * 210;
    end;
    DinAPortrait0, DinALandscape0:
    begin
      X := 4 * 210;
      Y := 4 * 297;
    end
    else // DinAPortrait4, DinALandscape4:
    begin
      X := 210;
      Y := 297;
    end;
  end;
  if Landscape then
  begin
    FMMWidth := Max(X, Y);
    FMMHeight := Min(X, Y);
  end
  else
  begin
    FMMWidth := Min(X, Y);
    FMMHeight := Max(X, Y);
  end;
end;

{ TPdf }

constructor TPdf.Create(const DinAFormat: TDinAFormat);
begin
  FCanvas := TCanvas.Create;
  FCanvas.Font.Charset := ANSI_CHARSET;
  FPixelsPerInch := DeviceCaps;
  FAutoLaunch := true;
  FDinAPage.DinAFormat := DinAFormat;
end;

destructor TPdf.Destroy;
begin
  FCanvas.Free;
  inherited;
end;

function TPdf.GetPageWidth: integer;
begin
  Result := Round(FPixelsPerInch / 25.4 * FDinAPage.MMWidth);
end;

function TPdf.GetPageHeight: integer;
begin
  Result := Round(FPixelsPerInch / 25.4 * FDinAPage.MMHeight);
end;

function TPdf.GetMMWidth: double;
begin
  Result := FDinAPage.MMWidth;
end;

function TPdf.GetMMHeight: double;
begin
  Result := FDinAPage.MMHeight;
end;

function TPdf.GetDinAFormat: TDinAFormat;
begin
  Result := FDinAPage.DinAFormat;
end;

function TPDF.DeviceCaps: integer;
var
  DC: HDC;
begin
  DC := GetDC(0);
  try
    Result := GetDeviceCaps(DC, LOGPIXELSX);
  finally
    ReleaseDC(0, DC);
  end;
end;

procedure TPdf.BeginDoc;
begin
  RolePDFBeginDoc(PChar(''), PChar(FFileName), PChar(FTitle), PChar(FAuthor),
    PChar(FSubject), PChar(FKeywords), PChar(FCreator),
    Round(cPdfDllPixelsPerInch / FPixelsPerInch * PageWidth),
    Round(cPdfDllPixelsPerInch / FPixelsPerInch * PageHeight));
end;

procedure TPdf.NewPage;
begin
  RolePDFNewPage;
end;

procedure TPdf.EndDoc;
begin
  RolePDFEndDoc;
  if FAutoLaunch then
    ShellExecute(0, 'open', PChar(FFileName), nil, nil, SW_SHOW);
end;

function TPdf.GetCanvas: TCanvas;
begin
  FCanvas.Handle := RolePDFGetDC;
  Result := FCanvas;
end;

function TPdf.GetPageCount: integer;
begin
  Result := RolePDFPageCount;
end;

function TPdf.GetPdfPageWidth: integer;
begin
  Result := RolePDFPageWidth;
end;

function TPdf.GetPdfPageHeight: integer;
begin
  Result := RolePDFPageHeight;
end;

function TPdf.MMToPixel(const MMX, MMY: double): TPoint;
begin
  Result.X := Round(FPixelsPerInch * MMX / 25.4);
  Result.Y := Round(FPixelsPerInch * MMY / 25.4);
end;

end.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz