2013-07-11 3 views
2

Je cherche un moyen de fusionner le contenu de deux pages pdf. Ce pourrait être un filigrane, une image ou quoi que ce soit.Fusion de deux pages PDF les unes sur les autres

Le scénario est le suivant: J'ai un add-in Word qui permet à l'utilisateur de créer différents modèles pour différents clients en fonction de plusieurs formulaires de modèles. Pour chaque nouveau client, l'utilisateur peut fournir un nouveau papier à lettre contenant une image d'en-tête/logos et un pied de page. Cela doit être appliqué de toute façon à l'exécution. Peut-être une image qui est chargée directement dans l'en-tête du modèle (alors je devrais rendre le pdf à l'image, car le papier à lettre sera principalement fourni en pdf) ou lors de l'exportation du document (fusion de papier à lettre) .

Mais le modèle ne doit pas être accessible par l'utilisateur, donc cela doit être fait par programme. Jusqu'à présent, j'ai essayé la bibliothèque Pdfsharp, qui ne supporte ni la version de mes fonds d'écran fournis, ni la version de mes documents créés dans Word 2007. iTextSharp semblait très prometteur, mais je n'ai pas réussi à fusionner le contenu jusque là. J'ai également essayé pdftk.exe, mais même quand je l'ai exécuté manuellement à partir de la ligne de commande, j'ai eu l'erreur: "Terminé, erreurs de saisie, donc pas de sortie créée."

Peu importe comment il est géré, mais la sortie est importante. J'ai oublié de mentionner, il y a une ligne blanche créée dans le modèle Word pour l'archivage, donc cette partie ne peut pas être ajoutée comme image ou doit être ajoutée après le mot dans le document de sortie.

Merci d'avance!

Répondre

2

StampStationery.cs, un échantillon de la Webified iTextSharp Examples qui, essentiellement, sont les C#/versions iTextSharp des échantillons Java/iText du livre iText in Action — 2nd Edition, ne montre comment ajouter le contenu d'une page d'un document PDF en tant que papier à lettres derrière le contenu de chaque page d'un autre PDF.

La méthode centrale est la suivante:

public byte[] ManipulatePdf(byte[] src, byte[] stationery) 
{ 
    // Create readers 
    PdfReader reader = new PdfReader(src); 
    PdfReader s_reader = new PdfReader(stationery); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
    // Create the stamper 
    using (PdfStamper stamper = new PdfStamper(reader, ms)) 
    { 
     // Add the stationery to each page 
     PdfImportedPage page = stamper.GetImportedPage(s_reader, 1); 
     int n = reader.NumberOfPages; 
     PdfContentByte background; 
     for (int i = 1; i <= n; i++) 
     { 
     background = stamper.GetUnderContent(i); 
     background.AddTemplate(page, 0, 0); 
     } 
    } 
    return ms.ToArray(); 
    } 
} 

Cette méthode retourne le PDF comme byte[]. manipulé

+0

Merci, cela semble très prometteur, je vais vérifier tout ça! – dth

+0

Juste pour clarifier: fonctionne exactement comme je le voulais! Lire les fichiers comme octet [], appeler cette fonction, enregistrer des octets - fait! :) – dth

+0

Super! Sachez toutefois que si vos documents sont volumineux, vous pouvez utiliser un autre constructeur 'PdfReader' (qui ne nécessite pas l'intégralité du PDF en mémoire) et utiliser un flux de fichier au lieu de' MemoryStream' en sortie. Sinon, vos ressources risquent d'être insuffisantes, en particulier si vous appelez cette méthode à partir de plusieurs threads simultanément. – mkl

Questions connexes