L'ouverture de mot de passe protégé fichier pdf avec iTextSharp
Je suis en train de faire une application qui devrait afficher des Pdf avec mot de passe. C'est mon code:
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
try
{
string filePath = Request.QueryString["filePath"];
if (filePath.ToUpper().EndsWith("PDF"))
{
copyPDF(filePath);
}
}
catch
{
string message = "<script language='Javascript'>alert('File Not Found! Call Records Department for verification. ')</script>";
ScriptManager.RegisterStartupScript(Page, this.GetType(), message, message, false);
}
}
}
public void copyPDF(string filePath)
{
iTextSharp.text.pdf.RandomAccessFileOrArray ra = new iTextSharp.text.pdf.RandomAccessFileOrArray(Server.MapPath(ResolveUrl(filePath)));
if (ra != null)
{
System.IO.MemoryStream ms = new System.IO.MemoryStream();
byte[] password = System.Text.ASCIIEncoding.ASCII.GetBytes("Secretinfo");
iTextSharp.text.pdf.PdfReader thepdfReader = new iTextSharp.text.pdf.PdfReader(ra, password);
int pages = thepdfReader.NumberOfPages;
iTextSharp.text.Document pdfDoc = new iTextSharp.text.Document();
iTextSharp.text.pdf.PdfCopy pdfCopy = new iTextSharp.text.pdf.PdfCopy(pdfDoc, ms);
pdfDoc.Open();
int i = 0;
while (i < pages)
{
pdfCopy.AddPage(pdfCopy.GetImportedPage(thepdfReader, i + 1));
i += 1;
}
pdfDoc.Close();
Byte[] byteInfo = ms.ToArray();
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", byteInfo.Length.ToString());
Response.BinaryWrite(byteInfo);
Response.Flush();
Response.End();
}
}
Mon code n'a pas de problème d'ouverture des fichiers pdf sans mot de passe mais il ne peut pas ouvrir les fichiers pdf avec un mot de passe, même si le mot de passe est fourni. L'application exécute la capture à la place. Ce qui semble être le problème avec mon code?
MODIFIER:
J'ai enlevé le Attraper de voir l'exception levée.
Détails De L'Exception: Système.ArgumentException: PdfReader pas ouvert avec propriétaire du mot de passe
Il dit que la source de l'erreur est à la Ligne 51.
Line 49: while (i < pages)
Line 50: {
Line 51: pdfCopy.AddPage(pdfCopy.GetImportedPage(thepdfReader, i + 1));
Line 52: i += 1;
Line 53: }
Qui exception est levée?
Il ne jette pas une exception. Il exécute l'instruction catch qui dans ce cas est une fenêtre qui dit " Fichier Non Trouvé! Appelez le Service des archives à des fins de vérification.'
hey @mkl j'ai enlevé la prise pour savoir quel type d'exception est levée, Il est dit Système.ArgumentException: PdfReader pas ouvert avec propriétaire du mot de passe.
Il semble que vous n'avez pas fourni le mot de passe correct.
Peut-être que le fichier PDF à la fois l'utilisateur et d'un mot de passe de propriétaire et que vous avez fourni le mot de passe utilisateur.
Il ne jette pas une exception. Il exécute l'instruction catch qui dans ce cas est une fenêtre qui dit " Fichier Non Trouvé! Appelez le Service des archives à des fins de vérification.'
hey @mkl j'ai enlevé la prise pour savoir quel type d'exception est levée, Il est dit Système.ArgumentException: PdfReader pas ouvert avec propriétaire du mot de passe.
Il semble que vous n'avez pas fourni le mot de passe correct.
Peut-être que le fichier PDF à la fois l'utilisateur et d'un mot de passe de propriétaire et que vous avez fourni le mot de passe utilisateur.
OriginalL'auteur Artemis | 2013-07-16
Vous devez vous connecter pour publier un commentaire.
Pour certaines opérations sur les documents de la bibliothèque iText(Sharp) exige que le document de ne pas simplement s'ouvre avec le mot de passe utilisateur, mais avec le mot de passe de propriétaire. Cela correspond à la définition de ces mots de passe dans la spécification PDF:
iText(Sharp) à l'heure actuelle ne permet pas de vérifier dans le détail les autorisations d'accès utilisateur spécifié dans le document de cryptage du dictionnaire mais au lieu de cela exige toujours le mot de passe du propriétaire pour des opérations nécessitant de certaines autorisations, et copie de l'ensemble des pages d'un document est définitivement l'un d'eux.
Cela dit, le iText(Sharp) les développeurs en sont conscients (en raison des nombreuses questions posées)
Pour permettre aux utilisateurs de faire ce pour quoi ils ont droit, et de prévenir la propagation de corrigé des copies de la bibliothèque iText(Sharp) contient un remplacement pour ce test dans les
PdfReader
classe:Ainsi, par la mise en
vous globalement remplacer ce mécanisme de vérification de l'autorisation.
Veuillez respecter les droits d'auteurs de documents PDF et de n'utiliser cette substitution si vous êtes autorisé à exécuter les opérations en question.
Alors soit vos PDF ou itext avait une erreur. Pouvez-vous fournir le PDF pour l'analyse?
Comment puis-je vous fournir le PDF? (Désolé. Si vous me dites comment je peux le faire, je serai plus qu'heureux.)
Stackoverflow lui-même ne dispose pas d'un service pour l'échange de fichier. Ainsi, lorsque dans le cadre de Stackoverflow fichiers doivent être fournis, souvent un service de partage de fichiers est utilisé, par exemple, afin de rendre les fichiers disponibles via Dropbox ou google drive, et l'URL est affichée ici.
vous pouvez voir le PDF ici
OriginalL'auteur
J'ai appliqué cette solution et ça fonctionne:
Eh bien, c'est juste une solution de contournement, comme je l'ai écrit. Mais il fonctionne 🙂 Probablement, il est plus logique d'utiliser l'une des constructeurs afin de mettre en ownerPasswordUsed de vrai. sourceforge.net/p/itext/code/HEAD/tree/trunk/itext/src/main/...
OriginalL'auteur