0
votes

Utilisez ITEXT 7 pour ouvrir un fichier PDF protégé par mot de passe avec des caractères non ASCII

J'utilise ITEXT 7 (version 7.1.7) dans mon projet NET 4 / C # et traitement des documents PDF qui ont des mots de passe utilisateur.

Les mots de passe sont supportés et tout fonctionne parfaitement bien, sauf pour Le caractère non ASCII (comme un signe de £) est utilisé dans le mot de passe.

Est-ce que quelqu'un sait un moyen d'obtenir IText 7 pour comprendre un mot de passe comme "Bonjour £ 1234"? < P> J'ai essayé d'extraire les octets de mot de passe en traitant ma chaîne comme UTF8 ou Unicode, mais rien ne semble fonctionner pour moi.

au point où j'essaie de charger le PDFDocument, je viens de faire un " Mauvais mot de passe utilisateur "exception

Voici mon code: xxx


0 commentaires

3 Réponses :


2
votes

Je pensais avoir trouvé la réponse à l'utilisation de la base de code par défaut de mon système, mais elle ne s'est pas révélée être 100% efficace

ASCII de la plaine ne peut pas représenter des caractères comme £, mais ASCII étendu (ou code page 437) peut. UTF8 peut également, mais différents types de codage semblent fonctionner dans des circonstances différentes. P>

Ma solution, pour l'instant, est juste d'essayer quelques-uns. C'est un peu d'approche de bélier de la battage, alors si quelqu'un a une solution plus élégante, je serais intéressé à le voir. P>

Voici mon code maintenant: p>

Encoding cp437 = Encoding.GetEncoding(437);
List<byte[]> passwordByteList = new List<byte[]>()
{
    Encoding.Default.GetBytes(password),   //Default codepage
    Encoding.UTF8.GetBytes(password),  //UTF8 encoding
    cp437.GetBytes(password),  //Code page 437 (extended ASCII) encoding
};

foreach(byte[] passwordBytes in passwordByteList)
{
    PdfReader reader = new PdfReader(tempInFile, new ReaderProperties().SetPassword(passwordBytes));
    try
    {
        //Try to open the PDF with the password 
        PdfDocument pdfDoc = new PdfDocument(reader);

        //Do something with the document
        pdfDoc.Close();
        reader.Close();
   }
   catch (Exception ex)
   {
       System.Diagnostics.Debug.WriteLine(ex.ToString());
       //Exception thrown by PDF reader. We need to try the next password.
       reader.Close();
   }
}


0 commentaires

0
votes

Avez-vous essayé d'utiliser Encoding.gecoding (1252)?

Je trouve que cela couvre normalement la plupart des caractères


0 commentaires

0
votes

En réalité, cela dépend de la révision du gestionnaire de sécurité utilisé pour chiffrer le PDF que vous essayez d'ouvrir.

ISO 32000-2 Spécifie:

Tous les mots de passe pour la révision 6 doivent être basés sur Unicode. Le prétraitement d'un mot de passe fourni par l'utilisateur consiste en premier à normaliser sa représentation en appliquant le profil "SASLPREP" ( Internet RFC 4013 ) de l'algorithme "StringPrep" ( Internet RFC 3454 ) au mot de passe fourni à l'aide des options normalisées et bidi. Ensuite, la chaîne de mot de passe doit être convertie en codage UTF-8, puis tronquée aux 127 premiers octets si la chaîne est supérieure à 127 octets (voir 7.6.4.3.2, «Algorithme 2.A: Récupération de la clé de cryptage d'un document crypté afin de le déchiffrer (révision 6 et plus tard) ", étapes (A, B))).

Pour d'autres révisions, cela n'est pas spécifié et dépend de la mise en œuvre du gestionnaire de sécurité.

Ainsi, pour la révision 6, vous appliquez correctement l'encodage UTF-8, mais que vous manquez cette préparation de la normalisation. Dans des cas simples que la normalisation ne change pas le mot de passe, votre code réussira souvent.

Pour d'autres révisions, votre approche est aussi bonne que tout;)


0 commentaires