Rendering mit Quickpdf in ein XbpBitmap() Objek

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von Rudolf »

Hallo,
ich versuche direkt aus einem PDF in ein Bitmap zu rendern ohne vorher in ein File abzuspeichern. Hat sowas jemand schon gemacht ?
Rendering aus PDF:

Code: Alles auswählen

          cBuffer,.:RenderPagetoString(96,x,0)
@ 10,10   DCSTATIC TYPE XBPSTATIC_TYPE_RECESSEDBOX SIZE 210,297 OBJECT oStatic1 PIXEL
oBitmap := xbpBitmap():new():create()
oBitmap:setbuffer(cBuffer)
@ .1,.1  DCSTATIC TYPE XBPSTATIC_TYPE_BITMAP SIZE 210,297 CAPTION oBitmap OBJECT oBitmap PARENT oStatic1 PIXEL
funktioniert aber leider nicht. Muss ich vielleicht direkt in den PS rendern ?
Grüße
Rudolf
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von UliTs »

Für mich sieht das nach eXpress++ Code aus ...
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von Manfred »

Stimmt Uli, aber was möchtest Du damit sagen? Das es im falschen Bereich steht?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von Rudolf »

Hallo,
es geht um die Zuweisung des Buffers beim Rendern eines PDF's, ist nicht abhängig von eXpress++
Grüße
Rudolf
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von UliTs »

Manfred hat geschrieben:Stimmt Uli, aber was möchtest Du damit sagen? Das es im falschen Bereich steht?
Wenn dem so ist, natürlich :-) .
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von AUGE_OHR »

Rudolf hat geschrieben:ich versuche direkt aus einem PDF in ein Bitmap zu rendern ohne vorher in ein File abzuspeichern. Hat sowas jemand schon gemacht ?
Frage : aber ein "Anzeige" des PDF hast du ?

wenn du mit "Print Screen" den Inhalt der "Anzeige" immer noch "siehst" kommst du evtl. an den hDC von dem Fenster ran und kannst ihn dann in den Xbase++ PressSpace per oPS:LockHDC() übertragen.

Code: Alles auswählen

  IF ::nDllGDI = 0 ; ::nDllGDI:= DllLoad( 'GDI32.DLL' ) ; ENDIF
  IF ::nDllGDI <> 0
     oPS:= XbpPresSpace():new():create()
        ::oBmp:presSpace( oPS )
        IF ::oBmp:xSize <> nWidth .OR. ::oBmp:ySize <> nHeight
           ::oBmp:make( nWidth, nHeight )
        ENDIF

        IF ( nHandlePS:= oPS:LockHDC( DCX_***, @nHdcIn ) ) <> 0
              nHdcOutTmp:= DllCall( ::nDllGDI, 32, 'CreateCompatibleDC', 0 )
              DllCall( ::nDllGDI, 32, 'SelectObject', nHdcOutTmp, nHandleBmp )
              DllCall( ::nDllGDI, 32, 'BitBlt', nHdcIn, 0, 0, nWidth, nHeight, nHdcOutTmp, 0, 0, GRA_BLT_ROP_SRCCOPY )
              DllCall( ::nDllGDI, 32, 'DeleteDC', nHdcOutTmp )
              oPS:UnlockHDC( nHandlePS, nHdcIn )
       ENDIF
       DllCall( ::nDllGDI, 32, 'DeleteObject', nHandleBmp )
       oPS:destroy()
   ENDIF
   ReleaseDC( 0, nHdcOut )
   ::invalidateRect()
DCX_*** Konstanten

Code: Alles auswählen

   *  nHandle  := oPS:LockHDC( 0,@nHDC )
   *  nHandle  := oPS:LockHDC( DCX_WINDOW          ,@nHDC ) // 0x00000001
   *  nHandle  := oPS:LockHDC( DCX_CACHE           ,@nHDC ) // 0x00000002
   *  nHandle  := oPS:LockHDC( DCX_NORESETATTRS    ,@nHDC ) // 0x00000004
   *  nHandle  := oPS:LockHDC( DCX_CLIPCHILDREN,    @nHDC ) // 0x00000008
   *  nHandle  := oPS:LockHDC( DCX_CLIPSIBLINGS    ,@nHDC ) // 0x00000010
   *  nHandle  := oPS:LockHDC( DCX_PARENTCLIP      ,@nHDC ) // 0x00000020
   *  nHandle  := oPS:LockHDC( DCX_EXCLUDERGN      ,@nHDC ) // 0x00000040
   *  nHandle  := oPS:LockHDC( DCX_INTERSECTRGN    ,@nHDC ) // 0x00000080
   *  nHandle  := oPS:LockHDC( DCX_EXCLUDEUPDAT    ,@nHDC ) // 0x00000100
   *  nHandle  := oPS:LockHDC( DCX_INTERSECTUPDATE ,@nHDC ) // 0x00000200
   *  nHandle  := oPS:LockHDC( DCX_LOCKWINDOWUPDATE,@nHDC ) // 0x00000400
   *  nHandle  := oPS:LockHDC( DCX_VALIDATE        ,@nHDC ) // 0x00200000
gruss by OHR
Jimmy
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von Rudolf »

Hallo Jimmy,
das PDF wird nicht angezeigt, ich will nur das gerenderte BMP anzeigen. Acrobat ist zu langsam und ich brauche nur die erste Seite für eine Vorschau bei mehrseitigen PDF's. Quickpdf hat verschiedene Renderingfunktionen:http://www.quickpdflibrary.com/help/qui ... inting.php
Ich denke es muss RenderPageToDC sein, wie bekomme ich vom xbpbitmap Object den Device Context handle (DC) ?
Grüße
Rudolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von brandelh »

Hallo Rudolf,

QuickPDF kann in ein Fensterobjekt schreiben - wie man an deren PowerBasic Beispiel sieht - und die von dir erwähnte Funktion macht das auch,
dafür bräuchte man ein Windowshandle des controls oder der drawingarea und müsste dem Programm mit Pablos CallBack Compiler eine CallBackFunktion spendieren ...

Viel einfacher ist es jedoch mit RenderPageToVariant() (ActiveX, ich nutze RenderPageToString() mit der DLL) die Seite in eine Stringvariable (BytePuffer) zu schreiben.
Eventuell muss man noch den BMP Header voranstellen und dann deinem XbpBitmap Objekt unterschieben ...

Ich meine ich hätte sowas schon gesehen, kann aber aktuell den Code nicht finden.
Eventuell man nach der obigen Funktion suchen ...
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von Rudolf »

Hallo Hubert,
genau das habe ich gemeint, irgendwie muss ich den Buffer in das xbpbmp Objekt bekommen. Wie komme ich zum PS vom bmp Objekt das ich erstellt habe ? Damit könnte ich dann experimentieren.
Grüße
RUdolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von brandelh »

Der String der zurückkommt muss hier rein, wobei ich nicht sicher bin, ob ohne die 14 Byte BMP Info oder nicht, ich weiß auch nicht ob die von QuickPDF geliefert werden ...

Code: Alles auswählen

XbpBitmap()
Syntax 
:setBuffer( [<cBuffer>], [<nFormat>], [<nCompression>] ) --> cOldBuffer 
Parameter 
<cBuffer> ist eine Zeichenkette, die eine Rastergrafik enthält. 
<nFormat> kennzeichnet das Bitmap-Datenformat für den Rückgabewert der Methode. Es können Konstanten aus der folgenden Tabelle eingesetzt werden. Sie sind in der Datei XBP.CH definiert:  
...
  XBPBMP_FORMAT_WIN3X       Windows 3.x Bitmap                   
...
  XBPBMP_FORMAT_DEFAULT *)  Konstante ist unabhängig  vom  Betriebssystem  *) Standardwert

Rückgabe 

Die Methode gibt den Puffer eines XbpBitmap-Objekts zurück, der vor dem Aufruf der Methode gespeichert war. Falls <nFormat> angegeben ist, wird der Rückgabewert in das entsprechende Grafik-Format konvertiert. 

Beschreibung 

Durch die Methode :setBuffer() kann der Puffer eines XbpBitmap-Objekts abgefragt oder geändert werden. Der Puffer enthält die Informationen einer Grafik als Zeichenkette. 
Der Parameter <nCompression> ist nur für die Grafikformate PNG und JPEG/JPG von Bedeutung. Bei letzteren nimmt die Bildqualität mit zunehmender Kompressionsrate ab. 
Hinweis: Falls die Grafik in einem Bitmap-Format vorliegt, entspricht der Puffer dem Inhalt einer Bitmap Datei ohne die ersten 14 Bytes (= Datei Header).
Der Dateiheader von BMP ist "BM"+Größenangeben etc. Wenn also der String den du von QuickPDF erhälst mit "BM" anfängt, dann muss man wohl substr(cQuickPDFBMP,15) an XbpBitmap übergeben, wenn nicht sollte es so passen. Hier habe ich den umgekehrten Weg (vom XbpBitmap()-Objekt an QuickPDF dargestellt)

Code: Alles auswählen

// -------------------------------------------------------------------------------------------------------------------
METHOD HBPrintPDF:AddImageFromXbpBMP(cBMP) // NUR BEI BMP für Rückgabewert von XbpBitmap():setBuffer()   !!! *.BMP !!!
                                           // ONLY with BMP and return value from XbpBitmap():setBuffer()!!! *.BMP !!!
   if left(cBMP,2) # "BM"
      cBMP := "BM"+U2BIN(len(cBMP)+14)+W2BIN(0)+W2BIN(0)+U2BIN(BIN2U(left(cBMP,4))+14)+cBMP
   endif
return ::AddImageFromString(cBMP,0)        // !!! *.BMP !!!
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von Rudolf »

Hallo Hubert,
danke für den Tip, man muss die ersten 15 Zeichen entfernen, dann klappt es.
Grüße
Rudolf

Code: Alles auswählen

function pdftest()
******************************************************************
local oStatic1,oBitmap,nPageID,nPages,cBuffer := ""
TQuickPdf():Register(QUICKPDF_KEY)
cFile := "test.pdf"
altd()
WITH OBJECT ( oPdf := TQuickPdf():New() )
     nPageID := .:LoadFromFile(cFile)
     cBuffer := .:RenderPageToString(96,1,0)
     .:Destroy()
END WITH
DCHOTKEY xbeK_ALT_F12    ACTION {||dc_inspectobject(oBitmap)}
if left(cBuffer,2) = "BM"
     cBuffer := substr(cBuffer,15)
endif
oBitmap := xbpBitmap():new():create()
oBitmap:setbuffer(cBuffer)

@ 0,0 DCSTATIC TYPE XBPSTATIC_TYPE_BITMAP SIZE 210,297 OBJECT oStatic1 ID "STATIC1" OPTIONS XBPSTATIC_BITMAP_TILED PIXEL
DCBITMAP oBitmap PARENT oStatic1 ID "BITMAP1" OBJECT oPage
dcread gui fit
return nil
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von AUGE_OHR »

Rudolf hat geschrieben:danke für den Tip, man muss die ersten 15 Zeichen entfernen, dann klappt es.
jaja ... die PDR 6009
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von brandelh »

Tja, ein klarer Designfehler von XbpBitmap() in Bezug auf BMP Dateien.
Ob Xbase++ intern die 14 Byte Header nutzt oder nicht spielt keine Rolle, diese Methode hätte schon immer den Inhalt einer normalen BMP Datei zurückgeben und auch übernehmen müssen.
Aber wer ist schon frei von Fehlern ;-)

Aber der Code, welcher als "Workaround" aufgeführt ist, finde ich etwas umständlich.
Für HBPrintPDF() habe ich eine Methode die den Header erzeugt erstellt:

Code: Alles auswählen

// Rückgabewert von XbpBitmap() im BMP Format ohne Header wird per cBMP übergeben.
METHOD HBPrintPDF:AddImageFromXbpBMP(cBMP) // NUR BEI BMP für Rückgabewert von XbpBitmap():setBuffer()   !!! *.BMP !!!
   if left(cBMP,2) # "BM" // sicher ist sicher, wenn der String (Bytearray) mit "BM" beginnt, dann ist der Header schon davor !
      cBMP := "BM"+U2BIN(len(cBMP)+14)+W2BIN(0)+W2BIN(0)+U2BIN(BIN2U(left(cBMP,4))+14)+cBMP
   endif
return ::AddImageFromString(cBMP,0)        // !!! *.BMP !!!
// BMP mit Header für Übergabe an XbpBitmap():setBuffer() vorbereiten ...
eine allgemeingültige einfache Funktion wäre das:

Code: Alles auswählen

// Rückgabewert von XbpBitmap() im BMP Format ohne Header wird per cBMP übergeben.
function BMPaddHeader(cBMP)
   if left(cBMP,2) # "BM" // sicher ist sicher, wenn der String (Bytearray) mit "BM" beginnt, dann ist der Header schon davor !
      cBMP := "BM"+U2BIN(len(cBMP)+14)+W2BIN(0)+W2BIN(0)+U2BIN(BIN2U(left(cBMP,4))+14)+cBMP
   endif
return cBMP
Aus einer Datei den Header abzuschneiden ist noch einfacher, da er immer 14 Byte lang ist ;-)

Code: Alles auswählen

// Rückgabewert von XbpBitmap() im BMP Format ohne Header wird per cBMP übergeben.
function BMPnoHeader(cBMP)
   if left(cBMP,2) # "BM" // sicher ist sicher, wenn der String (Bytearray) mit "BM" beginnt, dann ist der Header schon davor !
      cBMP := substr(cBMP,15)
   endif
return cBMP
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Rendering mit Quickpdf in ein XbpBitmap() Objek

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Tja, ein klarer Designfehler von XbpBitmap() in Bezug auf BMP Dateien.
Ob Xbase++ intern die 14 Byte Header nutzt oder nicht spielt keine Rolle, diese Methode hätte schon immer den Inhalt einer normalen BMP Datei zurückgeben und auch übernehmen müssen.
Aber wer ist schon frei von Fehlern ;-)
wohl keiner ... aber Fehler MUSS man korrigieren !

es ist wieder ein typisches Xbase++ Problem was erst dann in Erscheinung tritt wenn man die Xbase++ "Welt" verlässt und mit Windows oder anderen Applikationen "kommunizieren" will.
gruss by OHR
Jimmy
Antworten