2016-10-17 2 views
0

J'ai rencontré un problème. J'ai besoin d'ajouter un tampon personnalisé (type d'annotation) à un certain nombre de fichiers .pdf. Je peux le faire via Actions pour Acrobat X Pro, mais mes clients n'ont pas cette licence et ils doivent toujours le faire. La liste des fichiers est stockée dans une feuille de calcul Excel, donc idéalement, je suis à la recherche d'une solution VBA. Je suis venu avec le code suivant:Ajout d'un tampon PDF personnalisé à un document à partir de VBA

Option Explicit 
Sub code1() 
Dim app As Acrobat.AcroApp 
Dim pdDoc As Acrobat.CAcroPDDoc 
Dim page As Acrobat.CAcroPDPage 
Dim recter(3) As Integer 'Array defining the rectangle of the stamp - in real code wil be calculated, simplified for ease of reading 

Dim jso As Object 
Dim annot As Object 
Dim props As Object 
Set pdDoc = Nothing 
Set app = CreateObject("AcroExch.App") 
Set pdDoc = CreateObject("AcroExch.PDDoc") 

recter(0) = 100 
recter(1) = 100 
recter(2) = 350 
recter(3) = 350 

pdDoc.Open ("C:\Users\maxim_s\Desktop\Code_1\test1.pdf") 

Set jso = pdDoc.GetJSObject 

If Not jso Is Nothing Then 

Set page = pdDoc.AcquirePage(0) 

Set annot = jso.AddAnnot 

Set props = annot.getprops 
    props.page = 0 
    props.Type = "Stamp" 
    props.AP = "#eIXuM60ZXCv0sI-vxFqvlD" 'this line throws an error. The string is correct name of the stamp I want to add 
    props.rect = recter 
annot.setProps props 

If pdDoc.Save(PDSaveFull, "C:\Users\maxim_s\Desktop\Code_1\test123.pdf") = False Then 
    MsgBox "fail" 
    pdDoc.Close 
Else 
    MsgBox "success" 
    pdDoc.Close 
End If 
End If 
End Sub 

Le problème est avec les setprops et getprops procédures - il semble que, au moment où l'annotation est créée (jso.AddAnnot) ne possèdent pas la propriété AP, qui est le nom du tampon que je veux ajouter. Si je définis la propriété Type= "Stamp" d'abord et puis essayez de spécifier le AP, le résultat est que l'un des timbres par défaut est ajouté et il AP est renommé en mes timbres personnalisés AP. A noter également, que si je lance acrobate et utiliser le code ci-dessous, le tampon approprié est ajouté:

this.addAnnot({page:0,type:"Stamp",rect:[100,100,350,350],AP:"#eIXuM60ZXCv0sI-vxFqvlD"}) 

S'il y a un moyen d'exécuter ce Javascript de VBA à l'intérieur de l'objet PDDoc, qui va résoudre le problème, mais jusqu'ici j'ai échoué.

+1

Salut, je ne sais pas comment faire ça aussi. Mais qu'en est-il de l'utilisation de VBA pour insérer une zone de texte avec votre tampon/notation comme contenu. Imprimer/exporter les fichiers au format PDF et masquer/effacer la boîte de texte par la suite? – Doug

Répondre

1

Vous pouvez utiliser "ExecuteThisJavaScript" depuis l'AForm Api. court exemple:

Set aform = CreateObject ("AFormAut.App")

AForm.Fields.ExecuteThisJavaScript "var x = this.numPages; app.alert (x);"

L'avantage est que vous n'avez pas besoin de traduire les exemples js en code jso. Si vous recherchez ExecuteThisJavaScript, vous obtiendrez des exemples de plus en plus longs.

Bonne chance, reinhard

+0

C'est une excellente solution! Il semble que l'objet AVDoc fonctionne correctement, ce qui est nettement plus lent que l'opération PDDoc, mais cela fonctionne! Savez-vous s'il existe un moyen d'exécuter Javascript à partir d'un objet PDDoc? P.S. Pourquoi reinhard? –

+0

"..Savez-vous s'il existe un moyen d'exécuter Javascript à partir d'un objet PDDoc?". Je ne sais pas, vous pouvez le tester, peut-être avec .GetPDDOC ou ouvrir le Doc directement avec le code JS. Pour travailler plus vite, vous pouvez opérer en mode caché. Reinhard est mon prénom. Si je recherche dans google pour: "ExecuteThisJavaScript + Reinhard" je reçois tous mes exemples indépendamment du Forum où j'ai publié (Adobe, VBS, auotIT, ..) – ReFran

0

... En

props.Type = "Stamp" 

Le type doit être en minuscules. Mais si le JavaScript pur fonctionne à partir de la console, vous pourriez envisager d'exécuter la chaîne en utilisant le jso.

+0

Je n'arrive pas à comprendre comment insérer le Java pur dans le code vba et faire fonctionner Java. Le mieux que j'ai obtenu jusqu'ici est d'ouvrir le .pdf et d'afficher le débogueur javascript avec le code nécessaire, mais je dois appuyer sur ctrl-enter manuellement, ce qui n'est pas une solution. –