none
[Acces piece jointe] modifier pdf RRS feed

  • Question

  • Bonsoir,

    J'ais créer un evenement sur une liste visant à accéder au fichier joint (pdf) pour le modifier via la librairie itextsharp.

    Je me demande comment faire pour accéder au fichier pdf, à obtenir le chemin physique ou il se trouve..

    J'ais éssayer la propriété UrlPrefix mais ça n'a pas l'air de fonctionner..

    si vous avez une piste, merci
    Développeur en herbe..
    mardi 12 janvier 2010 15:26

Toutes les réponses

  • string pdfTemplate = url_pdf;
    PdfReader pdfReader = new PdfReader(pdfTemplate);
    Bonjour,

    J'ai récupéré le chemin du fichier ainsi :

    SPSite MySite = properties.ListItem.ParentList.ParentWeb.Site;
    SPFile MyFile = properties.ListItem.File;
    string url_pdf = MySite.MakeFullUrl(MyFile.ServerRelativeUrl);
    Seulement maintenant, quand je charge le fichier pdf avec le chemin renseigné dans un nouveau pdfreader comme ci-dessus, j'obtiens une erreur 401 Non autorisé.. d'ou peut provenir cette erreur?


    Développeur en herbe..
    mercredi 13 janvier 2010 10:34
  • En fait, le chemin du fichier à prendre en compte n'est pas l'url mais le chemin du server tel que "\\monsite\site\sous-site\biblio".

    En rentrant ce chemin en brut dans le code, j'arrive à :

    - dupliquer le fichier pdf
    - Lui coller un tampon genre "Obsolete"

    Si je ne me trompe pas, tout les fichier pdf d'une liste sont sur le serveur sous la meme structure à savoir : "\\monsite\site\sous-site\biblio\mesfichier.pdf" ?

    Dans ce cas, il faudrais reconstituer ce chemin grace à l'url du site en cours. ( ce que je suis capable de faire) et le nom du fichier pdf (il y a surement une propriété qui le donne)
    puis de supprimer le fichier original pour le remplacer par le nouveau.

    Mon code s'éxécute à la suite d'un évenement sur l'item (ItemUpdated), si son statut passe de Valide à obsolete, j'opère le traitement pour coller un tampon sur le pdf associé..


    http://nallerhand.free.fr >> Trucs & Astuces développement
    mercredi 13 janvier 2010 11:21
  • Il ne me reste qu'une seule chose à faire..
    quand je veux tamponner un pdf, je doit dupliquer le premier, donc en créer un autre puis supprimer l'orinigal et renomer le nouveau, or cela a pour conséquence dans la liste de créer un nouvel élément..et donc sans les données du fichier pdf original et avec l'icone Nouveau!

    Je voudrais pouvoir remettre toutes les données de l'ancien fichier au nouveau et supprimer l'icone Nouveau! (enfin si je remet l'ancienne date de création, elle disparaitra automatiquement je pense).

    Je ne sais pas trop comment procéder..


    http://nallerhand.free.fr >> Trucs & Astuces développement
    mercredi 13 janvier 2010 16:27
  • Bonjour,

    avez vous essayé d'écraser le fichier plutôt que d'en créer une copie, supprimer l'original et renommer la copie ? Cette méthode me parait étrange :)
    SPFile.OpenBinary() et SPFile.SaveBinary() me paraitrait aussi plus adapté que d'attaquer le fichier via son chemin webdav. Mais après tout si ca marche..

    Pour l'icone new, son apparition ne peut se paramétrer qu'au niveau d'une web application, via la propriété SPWebApplication.DaysToShowNewIndicator.
    On pourrait cependant imaginer la cacher via du code javascript référencé dans la page AllIttems.aspx de la liste en question.

    J'espère que cela vous aura aidé
    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il apparaisse comme résolu.
    • Proposé comme réponse Arnault Nouvel vendredi 15 janvier 2010 07:27
    vendredi 15 janvier 2010 07:27
  • Bonjour,

    Depuis, mon projet a évolué.

    Ce que ma Dll (fais dans ma liste ) lors du changement de statut d'un document (donc sur l'évenement ItemUpdated) :

    - dupliquer le fichier original (je traite ici des pdf) pour le charger en tant que reader
    - charger le fichier original en tant que stamper (fichier sur lequel j'applique le tampon via la librairie itextsharp)

    Dans ce cas, plus de probleme quand à l'icone nouveau document et quand à la sauvegarde des données du document orinigal.

    Néanmoins, il me reste à supprimer le fichier dupliqué.. chose pour laquelle j'ai des problemes. ma ligne de code pour supprimer le fichier n'est jamais atteinte. et apres avoir deboguer ma dll, il y a un certains nombre de choses que je ne comprends pas.. on dirais que ma dll boucle..car en effet je crois qu'en créant le fichier dupliqué, cela appel l'évenement ItemAdded et donc ItemUpdated etc.

    Bref, phénomène étrange aussi :
    quand je vais voir directement le fichier sur le serveur via l'explorateur windows, le fichier temporaire que je doit supprimer disparait et réaparait quand j'appui sur F5 ..

    voici mon code si ça peut aider :

        public class PdfMark : SPItemEventReceiver
        {
    
            public override void ItemUpdated(SPItemEventProperties properties)
            {
    // Récupération des propriétés de la liste avant et apres la MAJ SPItemEventDataCollection prop_before = properties.BeforeProperties; SPItemEventDataCollection prop_after = properties.AfterProperties; // Détermination si le statusDoc est changé if(prop_before["StatutDoc"] != prop_after["StatutDoc"]) { SPSite MySite = properties.ListItem.ParentList.ParentWeb.Site; SPFile MyFile = properties.ListItem.File; string url_pdf = MySite.MakeFullUrl(MyFile.ServerRelativeUrl); string statut = prop_after["StatutDoc"].ToString(); SetPdfMark(url_pdf,statut); } } private void SetPdfMark(string url_pdf, string statut) { try { // Reconstitution du chemin string url_sans_http = url_pdf.Substring(5); string url_proper=url_sans_http.Replace('/', '\\'); // On récupère le chemin du repertoire ou est stocké le pdf string[] url_folder = url_proper.Split('\\'); string[] pdfTemplate_duplicate_url = url_proper.Split('.'); string pdfTemplate = url_proper; string pdfTemplate_duplicate = pdfTemplate_duplicate_url[0] + "temp.pdf"; DisableEventFiring(); File.Copy(pdfTemplate, pdfTemplate_duplicate); PdfReader pdfReader = new PdfReader(pdfTemplate_duplicate); PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(pdfTemplate, FileMode.Open)); AcroFields pdfFormFields = pdfStamper.AcroFields; string chartLoc = string.Empty; // Séléction de l'image selon le statut if (statut == "Valide") chartLoc = @"cheminimg\Approuve.jpg"; else if (statut == "Obsolète") chartLoc = @"cheminimg\Obsolete.jpg"; Image chartImg = Image.GetInstance(chartLoc); chartImg.Alignment = Image.UNDERLYING; iTextSharp.text.pdf.PdfContentByte overContent; Rectangle rect; try { Single X, Y; int pageCount = 0; rect = pdfReader.GetPageSizeWithRotation(1); if (chartImg.Width > rect.Width || chartImg.Height > rect.Height) { //chartImg.ScaleToFit(rect.Width, rect.Height); X = rect.Width -147; Y = 100; } else { // Format portrait X = rect.Width - 120; Y = 87; } chartImg.SetAbsolutePosition(X, Y); pageCount = pdfReader.NumberOfPages; // On met le tampon seulement sur la premiere page (overcontent = au dessus) overContent = pdfStamper.GetOverContent(1);//.GetUnderContent(i); overContent.AddImage(chartImg); pdfStamper.Close(); pdfReader.Close(); // On supprime l'ancien dossier File.Delete(pdfTemplate_duplicate); } catch (Exception ex) { Trace.Write(ex); } } catch (Exception ex) { Trace.Write(ex); } } }

    http://nallerhand.free.fr >> Trucs & Astuces développement
    vendredi 15 janvier 2010 09:18
  • En effet la boucle infinie au niveau du ItemUpdated est une problématique classique.

    L'idée pour empêcher ce phénomène est de désactiver les levées d'évenements pendant le traitement de l'événement initial, via les méthodes DisableEventFiring et EnableEventFiring.

    Exemple :

    public override void ItemUpdated(SPItemEventProperties properties){
       //Désactivation des levées d'événements
       this.DisableEventFiring();
    
       //Traitement  
    
       //Résactivation des levées d'événements
       this.EnableEventFiring();
    }


     


    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il apparaisse comme résolu.
    • Proposé comme réponse Arnault Nouvel vendredi 15 janvier 2010 11:04
    vendredi 15 janvier 2010 11:03
  • Effectivement, j'ai éssayer cela. Mais en mode debug, je vois qu'il retourne dans la fonction "SetPdfMark" tout de meme..je ne comprends pas pourquoi
    http://nallerhand.free.fr >> Trucs & Astuces développement
    vendredi 15 janvier 2010 11:20