@@ -51,6 +51,7 @@ This file is part of the iText (R) project.
5151
5252import javax .swing .*;
5353import java .io .*;
54+ import java .nio .charset .StandardCharsets ;
5455
5556/**
5657 * Wrapper for both iText's PdfReader (referring to a PDF file to read)
@@ -124,6 +125,24 @@ public PdfFile(byte[] file, boolean readOnly) throws IOException, PdfException {
124125 }
125126 }
126127
128+ private static byte [] requestPassword () {
129+ final JPasswordField passwordField = new JPasswordField (32 );
130+
131+ JOptionPane pane = new JOptionPane (passwordField , JOptionPane .QUESTION_MESSAGE , JOptionPane .OK_CANCEL_OPTION ) {
132+ private static final long serialVersionUID = 3695604506510737289L ;
133+
134+ @ Override
135+ public void selectInitialValue () {
136+ passwordField .requestFocusInWindow ();
137+ }
138+ };
139+
140+ pane .createDialog (null , "Enter the User or Owner Password of this PDF file" ).setVisible (true );
141+
142+ // TODO RES-427: SASLprep & truncate this
143+ return new String (passwordField .getPassword ()).getBytes (StandardCharsets .UTF_8 );
144+ }
145+
127146 /**
128147 * Does the actual reading of the file into PdfReader and PDFFile.
129148 *
@@ -138,42 +157,41 @@ protected void readFile(InputStream fis, boolean checkPass, boolean readOnly) th
138157 PdfReader reader ;
139158 PdfWriter writer ;
140159 permissions = new Permissions ();
160+ ReaderProperties readerProps = new ReaderProperties ();
161+ final byte [] password ;
141162 if (checkPass ) {
142- final JPasswordField passwordField = new JPasswordField (32 );
143-
144- JOptionPane pane = new JOptionPane (passwordField , JOptionPane .QUESTION_MESSAGE , JOptionPane .OK_CANCEL_OPTION ) {
145- private static final long serialVersionUID = 3695604506510737289L ;
146-
147- @ Override
148- public void selectInitialValue () {
149- passwordField .requestFocusInWindow ();
150- }
151- };
152-
153- pane .createDialog (null , "Enter the User or Owner Password of this PDF file" ).setVisible (true );
154-
155- byte [] password = new String (passwordField .getPassword ()).getBytes ();
156- reader = new PdfReader (fis , new ReaderProperties ().setPassword (password ));
157- permissions .setEncrypted (true );
158- permissions .setCryptoMode (reader .getCryptoMode ());
159- permissions .setPermissions ((int ) reader .getPermissions ());
160- if (reader .isOpenedWithFullPermission ()) {
161- permissions .setOwnerPassword (password );
162- permissions .setUserPassword (reader .computeUserPassword ());
163- } else {
164- JOptionPane .showMessageDialog (null , "You opened the document using the user password instead of the owner password." );
165- }
163+ password = requestPassword ();
164+ readerProps .setPassword (password );
166165 } else {
167- reader = new PdfReader (fis );
168- permissions .setEncrypted (false );
166+ password = null ;
169167 }
168+ reader = new PdfReader (fis , readerProps );
170169 baos = new ByteArrayOutputStream ();
171170 if (readOnly ) {
172171 document = new PdfDocument (reader );
173172 } else {
174- writer = new PdfWriter (baos ); //TODO: change writer mechanism
173+ writer = new PdfWriter (baos );
175174 document = new PdfDocument (reader , writer );
176175 }
176+ // we have some extra work to do if the document was encrypted
177+ if (reader .isEncrypted ()) {
178+ permissions .setEncrypted (true );
179+ permissions .setCryptoMode (reader .getCryptoMode ());
180+ permissions .setPermissions ((int ) reader .getPermissions ());
181+ if (password != null ) {
182+ if (reader .isOpenedWithFullPermission ()) {
183+ permissions .setOwnerPassword (password );
184+ permissions .setUserPassword (reader .computeUserPassword ());
185+ } else {
186+ JOptionPane .showMessageDialog (
187+ null ,
188+ "You opened the document using the user password instead of the owner password." );
189+ }
190+ }
191+ } else {
192+ permissions .setEncrypted (false );
193+ }
194+
177195 }
178196
179197 /**
0 commit comments