PDF aus HTML ansprechen

Fragen & Antworten zur Steuerung von 3D Inhalten in PDFs über JavaScript
Jess
Beiträge: 6
Registriert: 10.12.2006, 16:26

PDF aus HTML ansprechen

Beitrag von Jess » 23.02.2007, 16:05

Hallo Acronauts,

ich möchte mit Acrobat ein Objekt in 3D auf einer Webseite darstellen. Hierzu habe ich ein PDF in einem iFrame auf der Seite platziert. Soweit funktioniert das auch ganz gut, aber ich sehe keine Möglichkeit das PDF aus HTML heraus anzusprechen.

Also wenn ich z.B. das Material ändern will und hierzu auf der HTML Seite einen Button (JavaScript) hab, wie kann ich dann das PDF mit dieser Information füttern?

Das HostContainer Objekt funktioniert scheinbar nur mit InternetExplorer, ich benötige aber eine Lösung die auch mit anderen Browsern funktioniert.

Bin für jeden Tipp oder Lösungsansatz dankbar!
Jess




samoht
Beiträge: 1
Registriert: 02.03.2007, 14:55

PDF aus HTML ansprechen

Beitrag von samoht » 02.03.2007, 15:08

Habe das gleiche Problem!

Will aus html-seiten auf die javascript functions des embedded pdf zugreifen!

Hat jemand eine Ahnung?

acronaut
Beiträge: 693
Registriert: 14.09.2006, 21:32
Kontaktdaten:

PDF aus HTML ansprechen

Beitrag von acronaut » 17.03.2007, 01:54

Das Problem an der Geschichte ist ja , dass es rein über JavaScript kaum funktionieren kann. Meines Wissens nach hat man ja irgendwann JS auch mit einem gewisssen Sicherheitsgedanken im Hintergrund entwickelt. Also eine Programmiersprache zu haben, die nur innerhalb der Appliaktion ausgeführt werden kann (können sollte) in der sie gerade eben läuft, ohne der Möglichkeit nach aussen zu kommunizieren. Reader und Browser sind somit aber schon 2 Applikationen, die laufen und somit nicht über Javascript miteinander kommunizieren können.

Mit Hilfe des ActiveX Objects "HostContainer" kann man das ja wohl in geringem Umfang  bewerkstelligen, aber eben nur zum "versenden" von Messages. Hab aber bisher auch immer gelesen, dass es nur im IE funktioniert.

@ Jess: Aber wenn Du da schon mal ein Beispiel hast, wäre es echt toll, wenn Du das mal reinstellen könntest. Hab damit bisher noch nicht gearbeitet, würde mich aber trotzdem mal ziemlich interessieren, auch wenn es derzeit nur mit dem IE läuft.

Gruß,
Andi


spongebob
Beiträge: 41
Registriert: 09.02.2007, 20:49

PDF aus HTML ansprechen

Beitrag von spongebob » 17.03.2007, 18:49

Hallo,

mich würde interessieren ob es überhaupt möglich ist dem 3D-PDF mit Aufrufparameter ein beliebigen String zu übergeben. Diesem dem String kann man ja dann in ein unsichtbares Textfeld schreiben, welches dann ein Validate-event auslöst und analysiert (zB Sprache und Suchbegriffe). 

Gruß Spongebob

acronaut
Beiträge: 693
Registriert: 14.09.2006, 21:32
Kontaktdaten:

PDF aus HTML ansprechen

Beitrag von acronaut » 17.03.2007, 20:45

Hi,

ja, das scheint schon möglich zu sein, nämlich in dem man das PDF als ActiveX <OBJECT> einbindet. Am besten mal HostContainer und PDF googeln. Gibt da nicht wirklich viel, aber auch in der JS Referenz vom Acrobat ist es ganz kurz genannt. Damit kann man dann wohl eine Art "Message" übergeben, die in einem Textfeld erscheinen. Damit hast Du Recht, dass Dein Ansatz funktionieren müsste.
Aber: Das geht wohl nur im Internet Explorer.

Gruß,
Andi


Jess
Beiträge: 6
Registriert: 10.12.2006, 16:26

PDF aus HTML ansprechen

Beitrag von Jess » 03.04.2007, 14:17

Hallo Andi,

ich habe kein eigenes Beispiel mit dem Host-Container Objekt, weil eine Lösung die nur mit MS internet explorer funktioniert wurde von vorn herein ausgeschlossen.

In der Dokumentation für Acrobat ist ein Beispiel enthalten, aber selbst das hat hier nicht zuverlässig funktioniert.

Ich habe dann noch diverse andere Wege versucht, habe aber nichts gefunden was Ansatzweise eine brauchbare interaktive Kommunikation zwischen Acrobat und dem Rest der Welt ermöglicht.


Gruss,
Jess

Rob
Beiträge: 8
Registriert: 04.09.2007, 09:38

PDF aus HTML ansprechen

Beitrag von Rob » 04.09.2007, 12:36

Die Diskusion ist zwar schon ein wenig alt, aber ich habe einen recht einfachen Weg gefunden beliebigen JavaScript im PDF ausführen zu lassen und auch Rückgabe an eine externe Anwendung geben zu lassen.
Damit lässt sich schön viel Schindluder treiben.

Aus einer HTML-Seite wie zuvor angesprochen ist das ganze aber glaube ich so nicht möglich.

Das Ganze funktioniert so:
Das PDF erhält 2 unsichtbare Textboxen.
Die erste erhält den Namen "interScriptTextField" und muss mehrzeilige Eingaben erlauben.
Die zweite Textbox erhält den Namen "evalScriptButton" und muss bei Aktivierung (erhalt von Fokus) follgenden Code ausführen:

Code: Alles auswählen

var interScriptTextField = this.getField("interScriptTextField");
var result = ""
eval(interScriptTextField.value);
interScriptTextField.value = result;
Das JavaScript "eval" statement ist echt toll ^^

Nun kann beliebiger Code in das erste Textfeld eingegeben werden und mit einem Click auf das zweite Textfeld wird der Code ausgeführt und der Inhalt der Variable "result" zurück in das erste Textfeld geschrieben.
Das Script kann den wert von "result" ändern um eine Rückgabe zu realisieren.

Das ganze lässt sich per Hand steuern, aber auch über andere Programmiersprachen.
Hier jetzt ein Beispiel wie das ganze Über VB6 angesteuert werden kann:

Code: Alles auswählen

Option Explicit
' WICHTIG !!!
' Damit dieser Code lauffähig ist muss unter "Projekt->Verweise..." die
' Adobe Acrobat Type Library eingebunden werden
' Die Datei liegt gewöhnlich unter
' C:ProgrammeAdobeAcrobat 8.0Acrobatacrobat.tlb

' Wichtig !!!
' um die Konsolenausgabe zu sehen muss der Adobe Reader gestatet sein
' das VB-Programm hat keine Konsole (auch wenn ein PDF darin geöffnet ist)

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public acroExchAVDoc As Acrobat.CAcroAVDoc

Private Sub pdfLoad(fileName As String, ByVal hWnd As Long)
    pdfUnload ' if a pdf is already loaded it gets unloaded
    If Not acroExchAVDoc.OpenInWindowEx(fileName, hWnd, Acrobat.AVOpenParams.AV_DOC_VIEW, True, 0, Acrobat.PDViewMode.PDUseNone, Acrobat.AVZoomType.AVZoomFitPage, 0, 0, 0) Then
        MsgBox ("Öffnen der Datei fehlgeschlagen.")
    End If
End Sub

Private Sub pdfUnload()
    Dim pdfDoc As Acrobat.CAcroPDDoc
    Set pdfDoc = acroExchAVDoc.GetPDDoc()
    If pdfDoc Is Nothing Then
        ' no pdf was loaded
    Else
        pdfDoc.Close ' unload pdf
    End If
    Call acroExchAVDoc.Close(Acrobat.PDSaveFlags.PDSaveFull)
End Sub

Private Function pdfIsLoaded() As Boolean
    Dim pdfDoc As Acrobat.CAcroPDDoc
    Set pdfDoc = acroExchAVDoc.GetPDDoc()
    
    Dim isLoaded As Boolean
    If pdfDoc Is Nothing Then
        pdfIsLoaded = False
    Else
        pdfIsLoaded = True
    End If
    'Return
    Exit Function
End Function

Private Sub choosePdf_Click(Index As Integer)
    CommonDialog1.ShowOpen
    Dim path As String
    path = CommonDialog1.fileName
    pdfLoad path, pdfPictureBox.hWnd
End Sub

Private Sub Form_Load()
    Set acroExchAVDoc = CreateObject("AcroExch.AVDoc")
    
End Sub

Private Sub Form_Unload(Cancel As Integer)
    pdfUnload
End Sub

Private Function runScript(javaScript As String) As String
    
    Dim pdfOk As Boolean
    pdfOk = pdfIsLoaded()
    If pdfOk Then
        Dim pdfDoc As Acrobat.CAcroPDDoc
        Set pdfDoc = acroExchAVDoc.GetPDDoc()
        Dim jso As Object
        Set jso = pdfDoc.GetJSObject
        If Not jso Is Nothing Then
        
            ' "jso" looks good
            
            ' get all 3d-annotations of the first page
            Dim annots3d As Variant
            annots3d = jso.getAnnots3D(0)
            If IsArray(annots3d) Then
            
                ' maybe not necessary but just to be sure:
                'jso.console.println ("array with 3d-annotations ok")
                Dim annots3dArray() As Variant
                annots3dArray = annots3d
                Dim size As Integer
                Dim uVal As Integer
                Dim lVal As Integer
                uVal = UBound(annots3dArray)
                lVal = LBound(annots3dArray)
                size = uVal - lVal + 1
                Dim sizeStr As String
                sizeStr = size
                jso.console.println ("found " + sizeStr + " 3d-annotation(s)")
                If size >= 1 Then
                
                    ' 3d-annotation looks good
                    
                    ' "javaScript" is the JavaScript script that gets evaluated
                    ' VB will wait in the loop below until a new value has
                    ' been written to interScriptTextField (by this script)
                    
                    ' an example:
                    'javaScript = "console.println('test tom');result='rob'"
                    
                    Dim interScriptTextField As Object
                    Set interScriptTextField = jso.getField("interScriptTextField")
                    
                    ' save old content
                    Dim istfvOld As String
                    istfvOld = interScriptTextField.Value
                    
                    interScriptTextField.Value = javaScript
                    interScriptTextField.SetFocus
                    jso.getField("evalScriptButton").SetFocus ' eval script
                    
                    ' give JS as much time as it needs to execute the script
                    Do While interScriptTextField.Value = javaScript
                        Sleep (20)
                        DoEvents
                    Loop
                    
                    ' give JS time to write result (just to be sure)
                    Sleep (50)
                    
                    ' result should now be in textField, read it (and set it as return value)
                    runScript = interScriptTextField.Value
                    
                    ' recover old content
                    interScriptTextField.Value = istfvOld
                    
                    
                End If
            Else
                MsgBox ("Konnte keine 3D-Annotations finden")
            End If
            
        Else
            MsgBox ("Konnte kein JSObject erhalten")
        End If
    Else
        MsgBox ("Es ist keine PDF-Datei geladen")
    End If
   
    Exit Function
End Function

Die Funktion "runScript" erhält den auszuführenden Script als String und gibt den Inhalt der Variable "result" (siehe JavaScript Teil) zurück.

Hier ein Beispiel-Aufruf der Funktion:

Code: Alles auswählen

Dim javaScript As String
    javaScript = "var c3d = getAnnots3D(0)[0].context3D;" & vbCrLf & _
    "var scene = c3d.scene;" & vbCrLf & _
    "scene.defaultRenderOptions.illustrationRenderModeFaceColor.set(1,0,0);" & vbCrLf & _
    "var materials = scene.materials;" & vbCrLf & _
    "var materialsNum = materials.count;" & vbCrLf & _
    "for(i = materialsNum-1;i>=0;i--){" & vbCrLf & _
    "    var material = materials.getByIndex(i);" & vbCrLf & _
    "    var materialName = material.name;" & vbCrLf & _
    "    console.println('material:'+materialName);" & vbCrLf & _
    "    material.diffuseColor(0,1,0);" & vbCrLf & _
    "}" & vbCrLf & _
    "for (var i=scene.meshes.count-1; i>=0 ; i--) {" & vbCrLf & _
    "    scene.meshes.getByIndex(i).renderMode = 'bounding box';" & vbCrLf & _
    "}"
    
    Dim result As String
    result = runScript(javaScript)
 

Mir ist bewusst, dass das ganze eine mächtige Vergewaltigung ist... Um die Busy-waits kam ich übrigens nicht ohne weiteres herum.
Ein Scrollbalken um eine Animation anzusteuern bringt es bei mir auf ca. 10 FPS (gefühlsmäßig). Also es ist nicht sooo langsam.

Nun gut, ich denke das wäre es dann erstmal.

Angenehmen Tag,

Rob

Jess
Beiträge: 6
Registriert: 10.12.2006, 16:26

PDF aus HTML ansprechen

Beitrag von Jess » 04.09.2007, 13:04

Wow Rob,

klasse Pionierarbeit! Danke für's sharing! Werde bei Gelegenheit mal in die Details gehen.

Noch eine Frage: Wenn man die Acrobat.tlb in VB einbindet, bekommt man dann die JS (3D) Methoden mit den gewohnten Features angezeigt (Syntax-Highliter, Autocomplete usw.)?

Ich suche nämlich noch nach einer brauchbaren Entwicklungsumgebung speziell für Acrobat3D. Wenn das einbinden der TLB in die Microsoft Entwicklertools den gewünschten Effekt hätte, dann wäre vielleicht JScript Express ganz brauchbar?!

Gruß,
Jess

Rob
Beiträge: 8
Registriert: 04.09.2007, 09:38

PDF aus HTML ansprechen

Beitrag von Rob » 04.09.2007, 14:14

Hi,

erstmal danke für das "Wow" das baut richtig auf :)

Und nun zu deinen Fragen
[indent]Noch eine Frage: Wenn man die Acrobat.tlb in VB einbindet, bekommt man dann die JS (3D) Methoden mit den gewohnten Features angezeigt (Syntax-Highliter, Autocomplete usw.)?
[/indent]Einige der Funktionen scheinen direkt aus VB aufrufbar zu sein. Es war mir möglich auf das Scene-Objekt und ein paar andere Objekte und Funktionen zuzugreifen. Also in einer Schleife bin ich da mal über so einiges Iteriert. Aber alles was Spaß macht kann man nur über diese JavaScript-Injektion (oder wie auch immer ich das nennen soll) machen.
Wenn dich näher interessiert was bei mir ging und was nicht kann ich nochmal in meinen Backups nachschauen. Viel mehr als in der "runScript" Funktion war es aber nicht.
Syntax-Highlighter oder Autocomplete gibt es leider nicht (naja etwas kann der schon aus der *.tlb hohlen... aber das ist nicht verwertbar). Noch viel schlimmer; es kann erst runtime herausgefunden werden ob ein Attribut oder eine Funktion existiert. Wenn du also auf ein Attribut zugreifst das es garnich gibt fliegt das ganze erst runtime um die Ohren. VB und JS sind halt beide Skript-Sprachen (an der Stelle (was auch immer wieder die Definition von Skript-Sprache ist; keine Ahnung)).
Egal, genug dazu.

[indent]Ich suche nämlich noch nach einer brauchbaren Entwicklungsumgebung speziell für Acrobat3D. Wenn das einbinden der TLB in die Microsoft Entwicklertools den gewünschten Effekt hätte, dann wäre vielleicht JScript Express ganz brauchbar?!
[/indent]Ich bin überzeugt, das es aus neueren Dot Net umgebungen viel eleganter möglich ist PDs zu kontrollieren. Ich bin aufgrund eines bereits bestehenden Projektes nur an VB6 gefesselt.
Die *.tlb konnte ich auf jeden Fall auch aus Dot Net 2003 und ich glaube auch 2005 verwenden. Ging alles sofort (Die Syntax von VB schien mir nur komplett umgekrempelt (musste alles neu machen (war dann am Ende auch nur eine Lernerfahrung)))
JScript Express kenne ich leider nicht, ... aber ich habe auch JavaScript und VB6 extra für das Projekt gelernt.

Ich hoffe ich konnte dir etwas brachbares zukommen lassen.

Gruß,

Rob

Jess
Beiträge: 6
Registriert: 10.12.2006, 16:26

PDF aus HTML ansprechen

Beitrag von Jess » 05.09.2007, 13:48

Hi Rob,

ok, danke für die Infos. Ich hab mal die acrobat.tlb in Office Visual Basic eingebunden, aber leider sind da nur die Standard-Acrobat-Methoden drin und nichts von den 3D Sachen.

Ich befürchte, dass man sich eine komfortable Entwicklungsumgebung selber schnitzen muss :(

Ich mach bei Gelegenheit mal einen neuen Thread zu diesem Thema auf...

Grüsse, Jess

Antworten