PDF aus HTML ansprechen
PDF aus HTML ansprechen
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
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
PDF aus HTML ansprechen
Habe das gleiche Problem!
Will aus html-seiten auf die javascript functions des embedded pdf zugreifen!
Hat jemand eine Ahnung?
Will aus html-seiten auf die javascript functions des embedded pdf zugreifen!
Hat jemand eine Ahnung?
PDF aus HTML ansprechen
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
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
PDF aus HTML ansprechen
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
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
PDF aus HTML ansprechen
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
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
PDF aus HTML ansprechen
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
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
PDF aus HTML ansprechen
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:
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:
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:
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
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;
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
PDF aus HTML ansprechen
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
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
PDF aus HTML ansprechen
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
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
PDF aus HTML ansprechen
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
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