public override void ToPdf(PdfWriter writer, Stream os)
{
SuperToPdf(writer, os);
os.Write(STARTSTREAM, 0, STARTSTREAM.Length);
if (length > 0)
{
PdfEncryption crypto = null;
if (writer != null)
{
crypto = writer.Encryption;
}
if (offset < 0)
{
if (crypto == null)
{
os.Write(bytes, 0, bytes.Length);
}
else
{
crypto.PrepareKey();
byte[] buf = new byte[length];
crypto.EncryptRC4(bytes, buf);
os.Write(buf, 0, buf.Length);
}
}
else
{
byte[] buf = new byte[Math.Min(length, 4092)];
RandomAccessFileOrArray file = writer.GetReaderFile(reader);
bool isOpen = file.IsOpen();
try {
file.Seek(offset);
int size = length;
//added by ujihara for decryption
PdfEncryption decrypt = reader.Decrypt;
if (decrypt != null)
{
decrypt.SetHashKey(objNum, objGen);
decrypt.PrepareKey();
}
if (crypto != null)
{
crypto.PrepareKey();
}
while (size > 0)
{
int r = file.Read(buf, 0, Math.Min(size, buf.Length));
size -= r;
if (decrypt != null)
{
decrypt.EncryptRC4(buf, 0, r); //added by ujihara for decryption
}
if (crypto != null)
{
crypto.EncryptRC4(buf, 0, r);
}
os.Write(buf, 0, r);
}
}
finally {
if (!isOpen)
{
try{ file.Close(); }catch {}
}
}
}
}
os.Write(ENDSTREAM, 0, ENDSTREAM.Length);
}