Skip to content

Commit c1f6ecc

Browse files
committed
Fixed encryption of Unicode strings
1 parent a46f2c5 commit c1f6ecc

File tree

3 files changed

+30
-7
lines changed

3 files changed

+30
-7
lines changed

PdfSharpCore/Pdf.IO/PdfWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,8 @@ public void Write(PdfString value)
198198
WriteSeparator(CharCat.Delimiter);
199199
PdfStringEncoding encoding = (PdfStringEncoding)(value.Flags & PdfStringFlags.EncodingMask);
200200
string pdf = (value.Flags & PdfStringFlags.HexLiteral) == 0 ?
201-
PdfEncoders.ToStringLiteral(value.Value, encoding, SecurityHandler) :
202-
PdfEncoders.ToHexStringLiteral(value.Value, encoding, SecurityHandler);
201+
PdfEncoders.ToStringLiteral(value.EncryptionValue, encoding == PdfStringEncoding.Unicode, SecurityHandler) :
202+
PdfEncoders.ToHexStringLiteral(value.EncryptionValue, encoding == PdfStringEncoding.Unicode, SecurityHandler);
203203
WriteRaw(pdf);
204204

205205
_lastCat = CharCat.Delimiter;

PdfSharpCore/Pdf.Internal/RawUnicodeEncoding.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,9 @@ public override int GetCharCount(byte[] bytes, int index, int count)
6464

6565
public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex)
6666
{
67-
for (int count = byteCount; count > 0; byteIndex += 2, charIndex++, count--)
67+
for (int count = byteCount; count > 0; byteIndex += 2, charIndex++, count -= 2)
6868
{
69-
chars[charIndex] = (char)((int)bytes[byteIndex] << 8 + (int)bytes[byteIndex + 1]);
69+
chars[charIndex] = (char)((int)(bytes[byteIndex] << 8) + (int)bytes[byteIndex + 1]);
7070
}
7171
return byteCount;
7272
}

PdfSharpCore/Pdf/PdfString.cs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,10 +217,33 @@ public string Value
217217
/// </summary>
218218
internal byte[] EncryptionValue
219219
{
220-
// TODO: Unicode case is not handled!
221-
get { return _value == null ? new byte[0] : PdfEncoders.RawEncoding.GetBytes(_value); }
220+
get { return _value == null ? new byte[0] : GetBytesFromEncoding(); }
222221
// BUG: May lead to trouble with the value semantics of PdfString
223-
set { _value = PdfEncoders.RawEncoding.GetString(value, 0, value.Length); }
222+
set
223+
{
224+
var encoding = (PdfStringEncoding)(_flags & PdfStringFlags.EncodingMask);
225+
switch (encoding)
226+
{
227+
case PdfStringEncoding.Unicode:
228+
_value = PdfEncoders.RawUnicodeEncoding.GetString(value);
229+
break;
230+
default:
231+
_value = PdfEncoders.RawEncoding.GetString(value);
232+
break;
233+
}
234+
}
235+
}
236+
237+
private byte[] GetBytesFromEncoding()
238+
{
239+
var encoding = (PdfStringEncoding)(_flags & PdfStringFlags.EncodingMask);
240+
switch (encoding)
241+
{
242+
case PdfStringEncoding.Unicode:
243+
return PdfEncoders.RawUnicodeEncoding.GetBytes(_value);
244+
default:
245+
return PdfEncoders.RawEncoding.GetBytes(_value);
246+
}
224247
}
225248

226249
/// <summary>

0 commit comments

Comments
 (0)