à l'aide de ITextSharp pour extraire et mettre à jour les liens dans un fichier PDF existant
J'ai besoin de mettre plusieurs (lire: beaucoup) des fichiers PDF sur le web, mais beaucoup d'entre eux ont été codés en dur file://liens et des liens vers d'autres lieux publics. J'ai besoin de lire ces fichiers et de mettre à jour les liens vers les endroits appropriés. J'ai commencé l'écriture d'une application à l'aide de itextsharp à lire à travers les répertoires et les fichiers, trouver les fichiers Pdf et d'itérer sur chaque page. Ce dont j'ai besoin pour faire est de trouver les liens et ensuite mettre à jour celles incorrects.
string path = "c:\\html";
DirectoryInfo rootFolder = new DirectoryInfo(path);
foreach (DirectoryInfo di in rootFolder.GetDirectories())
{
//get pdf
foreach (FileInfo pdf in di.GetFiles("*.pdf"))
{
string contents = string.Empty;
Document doc = new Document();
PdfReader reader = new PdfReader(pdf.FullName);
using (MemoryStream ms = new MemoryStream())
{
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
doc.Open();
for (int p = 1; p <= reader.NumberOfPages; p++)
{
byte[] bt = reader.GetPageContent(p);
}
}
}
}
Franchement, une fois que je reçois le contenu de la page je suis un peu perdue sur ce quand il s'agit de iTextSharp. J'ai lu à travers le itextsharp exemples sur le site de sourceforge, mais n'a pas vraiment trouver ce que je cherchais.
Toute aide serait grandement appréciée.
Grâce.
Vous devez vous connecter pour publier un commentaire.
Celui-ci est un peu compliqué si vous ne connaissez pas le fonctionnement interne du format PDF et iText/iTextSharp abstraction/mise en œuvre. Vous avez besoin de comprendre comment utiliser
PdfDictionary
objets et de regarder les choses par leurPdfName
clé. Une fois que vous obtenez ce que vous pouvez lire à travers les officiel technique PDF et fouiner un document assez facilement. Si vous ne les soins, j'ai inclus les parties pertinentes de la technique (PDF) entre parenthèses, le cas échéant.De toute façon, un lien dans un document PDF est stocké sous forme d'une annotation (
PDF Ref 12.5
). Annotations en page de sorte que vous devez d'abord obtenir de chaque page annotation tableau individuellement. Il y a un tas de différents types d'annotations si vous avez besoin de vérifier chacunSUBTYPE
et de voir si son jeu deLINK
(12.5.6.5
). Chaque lien devrait ont unACTION
dictionnaire associé (12.6.2
) et que vous voulez vérifier l'action duS
clé pour voir quel type d'action il est. Il y a un tas de raisons possibles pour cela, le lien est en particulier pourrait être des liens internes ou d'ouvrir des liens vers des fichiers ou jouer des sons de liens ou de quelque chose d'autre (12.6.4.1
). Vous êtes à la recherche uniquement pour les liens qui sont de typeURI
(note de la lettreI
et non pas la lettreL
). URI Actions (12.6.4.7
) ont unURI
clé qui contient l'adresse de naviguer. (Il y a aussi unIsMap
propriété de l'image des cartes que je ne peux pas vraiment imaginer que quelqu'un l'aide.)Ouf. Encore de la lecture? Ci-dessous est un travail plein de VS 2010 C#, WinForms application basé sur mon post ici ciblage iTextSharp 5.1.1.0. Ce code a deux choses principales: 1) Créer un exemple de fichier PDF avec un lien pointant vers elle Google.com et 2) remplace le lien avec un lien vers bing.com. Le code doit être assez bien commenté mais n'hésitez pas à poser toutes les questions que vous pourriez avoir.
MODIFIER
Je devrais noter que cela ne change le lien. N'importe quel texte dans le document ne sera pas mis à jour. Les Annotations sont dessinées au-dessus du texte, mais ne sont pas vraiment liée à l'explication de toute façon. C'est un autre sujet complètement.
/S
à/JAVASCRIPT
et l'utilisation d'un/JS
entrée pour votre JavaScript. Si vous avez besoin de plus d'aide de la plupart des une nouvelle question ici, et je ne peux répondre mieux.De noter si l'Action est indirecte, il ne sera pas de retour d'un dictionnaire et vous aurez une erreur:
Dans les cas de possible indirects dictionnaires:
Dans ce cas, vous devez enquêter sur le retour de dictionnaire pour comprendre où l'URI est trouvé. Comme indirect /Lancement du dictionnaire de l'URI est situé dans l' /F élément de type PRIndirectReference avec l' /Type a /FileSpec et l'URI situé dans la valeur de /F
Ajouté du code pour traiter indirects et de lancer des actions et la valeur null annotation-dictionnaire: